图像识别传感器

本图像识别传感器是一款体积小巧,功耗低的初级视觉识别传感器。内置识别程序,所有识别算法都在本地处理,无须联网。具有颜色识别、大小识别、人脸跟踪、形状模糊识别等作用,可以用于跟踪小球、人脸,辨别方位距离,巡线,无人驾驶,自动分拣机等案例。用户可以自由输入想要识别的颜色信息,通过自有的单总线协议,可以和平台任何Arduinomicro:bit等主控板通讯,可用ScratchPythonArduino C++等编程,方便快捷。

参数

/描述

工作电压

DC 5V(内置3.3V电平转换)

接口类型

RJ11

通信方式

WM单总线

处理器

STM32高性能处理器,180MHz,ARM Crotex M4内核

摄像头

30W像素摄像头,视场角66°,最大帧率60fps,具有高灵敏度、镜头失光补偿、饱和度自动调节等功能

状态指示灯

当摄像头工作时,蓝色LED灯闪烁,识别一次,闪烁一次,不工作时熄灭

复位按键

当模块工作不正常时,可短按复位处理器

功耗

120mA~200mA

工作温度

-20~70

尺寸大小

55mm*24mm*18.5mm(**)

本模块内部机器视觉算法,会把处理好的结果反馈回主控,不能传输图片或者视频。有多种输出方式,满足不同应用需求,并支持参数输入和修改。具有自动锁定眼前目标,并跟踪的能力。拥有2种巡线输出方式,满足不同用户需求。

颜色识别色域:LAB空间

默认预设识别颜色:5种,分别是1-红,2-黄,3-蓝,4-草绿,5-深绿

自定义识别颜色:4

颜色识别速率:最快25ms

巡线模式输出:角度模式、坐标模式

    该模块支持的图形化编程平台目前有WeeeCode 3.0,其图形化编程指南如下:

模块功能

需传参数

图形化编程块举例(其他平台图形化编程块大同小异)

选择工作模式

(2个参数)端口、选择模式

判断工作模式是否更新数据成功(布尔值)

(2个参数)端口、选择模式

适用于巡线模式,当巡线模式更新数据成功后,获取到巡线角度偏差值

(1个参数)端口

 

 

判断选择需要追踪的颜色块是否更新数据成功(布尔值)

(2个参数)端口、设置要追踪颜色

适用于自动跟随模式及颜色追踪,更新数据成功后,可获取所追踪物块像素数量、中心点X坐标、中心点Y坐标

(2个参数)端口、选择要获取的返回值

 编程示例:

 

 

直接使用文本代码编程,就涉及到相关编程API:

Arduino 函数库介绍:

bool getLab(void)——反馈摄像头前面的LAB值。更新后数据为minL, maxL, minA, maxA, minB, maxB,分别为3个分量的最大和最小值。此模式具有自动捕捉功能,只有当摄像头中心区域内物体颜色基本一致时,才会锁定输出。用户可以根据反馈的LAB范围做适当修改,以满足不同环境下的识别。

void setAutoTrackingMode(void)——设置自动获取模式。此模式为先寻找摄像头前中心区域目标物体信息,当目标中心区域颜色基本一致时,锁定,随后跟踪此物体。此模式类似于小狗拾物的方式,先在眼前放置物体,然后寻找,程序简单,控制方便。

bool getAutoPosition(void)——获取自动模式下的物体信息。此函数需在setAutoTrackingMode模式下运行,用于获取目标物体在摄像头前的XY坐标位置以及像素大小。当摄像头捕捉到目标物体后返回1,没有捕捉到返回0

bool getColorPosition(uint8_t mun)——获取内置颜色mun的物体信息。此函数是捕捉内置5种颜色中的一种,是否出现在摄像头前。Mun填写1-5,分别对应1-红、2-黄、3-蓝、4-草绿、5-深绿。当摄像头捕捉到目标物体后返回1,没有捕捉到返回0。当返回1时,会更新物体的XY坐标位置以及像素大小。

void setLabColor1(int8_t minL, int8_t maxL, int8_t minA, int8_t maxA, int8_t minB, int8_t maxB)——设置用户指定的颜色信息。采用LAB色域,6个值代表一个范围。范围越宽,越容易识别,环境适应性越好,但误判的可能性也提高了。此函数为设置编号1的颜色信息,同理,有setLabColor2setLabColor3setLabColor4分 别对应234的颜色信息。

bool getAppColorPosition(uint8_t mun)——获取用户指定颜色mun的物体信息。此函数是捕捉用户自定义的颜色,Mun填写1-4,对应setLabColorX中的X序号。当摄像头捕捉到目标物体后返回1,没有捕捉到返回0。当返回1时,会更新物体的X Y坐标位置以及像素大小。

void setLineFollowerMode(void)——设置巡线模式。此模式下,摄像头会获取160*120像素大小灰度信息,用于分别黑线还白线。

void setLineFollowerThreshold(uint8_t min,uint8_t max)——设置需要捕捉线条的灰度阈值。如果背景是白色,线是黑色,一般取值[0100],取值最小为0,最大为255,纯黑为0,纯白为255

bool getLineFollowerAngle(void)——获取巡线角度信息。获取的角度信息是一个正负角度值,根据这个值控制小车左右转,这个值在±53°以内。当摄像头捕捉到线条后返回1,没有捕捉到返回0。注意此函数需要在setLineFollowerMode函数下使用。

bool getLineFollowerAxis(void)——获取巡线区域信息。此函数会更新5个值,代表摄像头前从远到近依次排列的5个区域的中心X坐标值,这5个区域代表黑线线条区域。当摄像头捕捉到线条后返回1,没有捕捉到返回0。注意此函数需要在setLineFollowerMode函数下使用。

void setPixelsThreshold(uint8_t mun)——设置识别物体最小像素数。当识别物体的像素数量超过mun时,才会收到反馈信息,否则就当没有识别。此函数可以用于过滤干扰,或者识别较大物体。默认为10

bool getColorAllPosition(uint8_t mun)——获取内置颜色mun物体的所有信息。与getColorPosition类似,但信息更多,共包括centerXcenterYpixelsframeXframeY highwidthrotation8个信息,分别代表物体中心X坐标、中心Y坐标、像素个数、物体边框X坐标、边框Y坐标、边框高度、边框宽度、物体旋转角度。由于数据较多,所有识别速率较getColorPosition慢。

bool getAppColorAllPosition(uint8_t mun)——获取用户指定颜色mun物体的所有信息。与getAppColorPosition类似,但信息更多,共包括centerXcenterYpixelsframeXframeYhighwidthrotation8个信息,分别代表物体中心X坐标、中心Y坐标、像素个数、物体边框X坐标、边框Y坐标、边框高度、边框宽度、物体旋转角 度。由于数据较多,所有识别速率较getAppColorPosition慢。

void resetColorMode(uint8_t time)——重新初始化物体识别(非巡线)。参数time为曝光时间,时间越短,拾取图像越黑,适合高亮度环境,时间越长,拾取图像越亮,适合较暗的环境。Time单位为毫秒,默认2000,适合较暗的环境。

bool getFacePositon(void)——获取人脸位置信息。当摄像头捕捉到人脸后返回1,没有捕捉到返回0。当返回1时,会更新人脸中心点的XY坐标值。

根据人眼的视觉效果,可以通过RGBCMYKHSBLAB色域,来将可见光的颜色描述出来。Lab颜色模型弥补了RGBCMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。 Lab颜色模型由三个要素组成,一个要素是亮度(L),a b是两个颜色通道a包括的颜色是从绿色(负数)到灰色(中值)再到红色(正数);b是从蓝色(负数)到灰色(中值)再到黄色(正数)。Lab颜色被设计来接近人类视觉。因此L分量可以调整亮度对,修改ab分量的输出色阶来做精确的颜色平衡。L取值为[0100]A取值为[-128+128]B取值为[-128+128]

下面是在同一环境中不同曝光时间后的画面,可以看出在time=1000时比2000时暗不少。图1、图2是在室内夜间拍摄,图3是在白天室内拍摄。可以看出不同条件下,曝光时间对识别的效果影响还是很大的。注意调整曝光时间,能更好的识别目标。

             

   1  Time=2000        2  Time=1000         3  Time=2000

1红色小球位置的LAB数值[60,72,54,66,-20,-8],图2LAB数值[45,58,66,74,-24,0],图3LAB数值[71,95,8,60,-37,-7],可以看出不同环境下的LAB值差别还是比较大的。

如下图为识别到一个橘红色圆

centerX——识别色块中心点的X坐标,这个中心点不一定是外框的二分之一处,当识别到的物体不是圆时,这个点就会偏重心方向。

centerY——识别色块中心点的Y坐标。

Pixels——色块像素点数量,也就是这个橘红色的圆占了多少个像素。    

frameX——外框的X坐标,这个外框会包含这个色块所有的像素。如果这个圆有一个角,那么这个外框也将包含这个角。

frameY——外框的Y坐标。

High——外框的高度

Width——外框的宽度

Rotation——物体旋转角度,此值是色块的旋转(单位:弧度)。如果色块类似铅笔或钢笔,那么这个值就是介于0-180之间的唯一值。 如果这个色块圆的,那么这个值就没有效用。如果这个色块完全不具有对称性,您只能由此得到0-360度的旋转。范围X[0,320]Y[0,240]

本模块有2种巡线方式,第一种直接给出角度值,范围从-53°到53°,用户可以根据这个角度来控制小车转动。第二种是给出5个值,如下图所示,在灰度图上,等分5个区域,每个区域会寻找黑线的中心点,返回这5个中心点的X坐标值,从linex1linex5分别代表从上到下的5个点,也就是从远到近。根据这些值就可以判断地图上是直线还是曲线,车的姿态是否一致,可以写一个加权公式,来判断是否需要转弯,转弯大小如何。通过设置setLineFollowerThreshold函数里阈值的大小,就可以改变黑线的识别灰度值,满足不同颜色的巡线地图需求。范围X[0,160]Y[0,120]

          

1 直线                     2 左转弯

本模式下可以制作视觉识别巡线小车或者模拟无人驾驶小车,需要注意的是,图像识别用于巡线的速度是不快的,最快50ms判断一次,所以和传统的巡线传感器相比,在速度上不具有优势。根据地图适当调整摄像头与地面的夹角以及和地面的高度,能更好的巡线。

1、标定视野范围

由于本模块不具有输出图像和视频的功能,所有在实际应用时,不知道摄像头的视野范围,不方便调试,这时需要对视野进行测定。测定的方法可以是用预定颜色的小球,从4个角落慢慢靠近中心,当在边缘位置小球被捕获,有数据输出后,即为视界边界。调整好合适的视野后,固定摄像头,这样就方便以后进一步的调试了。

2、同种颜色最多识别2

在摄像头范围内,同种颜色同时识别最多2个物体。如果有背景有很多零碎的颜色干扰,可以设置setPixelsThreshold识别物体最小像素数,这样就可以直接滤除一些小的色块干扰。

3、人脸识别

人脸识别采用的是240*160大小的灰度图,所以人脸距离摄像头20cm以上跟踪效果比较好。模块能只能同时识别1张人脸,人脸需要正对摄像头,侧着脸,或者歪着头都会影响识别效果,本算法仅支持整张脸的识别,不支持半张或者部分脸的识别。识别最快70ms一次。

1、环境的变化对图像检测的结果将产生不同影响,使用时应尽量注意:

  a、避免在过暗、过亮、强逆光的环境下使用;

  b、避免让灯光或强烈阳光直射目标物体,避免造成物体反光;

  c、避免在彩色灯光或可变换的灯光下使用,稳定均匀的白色是最好的光源;

  d、避免正对光源使用;

  e、尽量避免在背景图案复杂的情况下使用,或者目标物体和背景颜色相近;

2、开机时间。本模块从上电到开始接收指令是需要一定时间的,这个时间大概是3s左右,所以主程序上电设置摄像头参数时需要延迟3s以上,确保摄像头模块进入工作状态,或者上电后复位主控芯片。

3、图像识别模块一般为持续不断调用的,也就是不停的工作状态下使用,如果是隔比较久的一段时间再判断,可能数据缓存中会记录上一次未调取的数据,而直接反馈回来,所以在这种情况下使用,最好判断2次以上,排除残留干扰。

4、如果开启了人脸识别程序、或者巡线识别程序后,想开启寻找颜色的程序,需要调用resetColorMode()函数,把摄像头由灰度模式返回为彩色模式,当然也可以重启摄像头模块。

5、如果环境不是特别亮(如在太阳底下),建议模块在较暗处上电,然后再正常使用,这样识别效果更好,同一场景下识别的像素点更多。