目标跟踪是利用视觉传感器,选择特定物体作为特定目标,对该特定目标进行定位和跟踪的综合技术。因而处理过程可以分为两类:获取特征和目标跟踪。在实际环境中,特定目标是一些颜色鲜艳、饱和度高的物体,本功能实现首先在HSV域使用特征获取算法。
参考代码示例:https://github.com/BluesYu/MarStech_Vision_Sensor/tree/master/track_color_mode
一,算法基本思想:
实现原理:利用颜色空间来除去所有用户不感兴趣的背景,提取出前景。但是在实际的环境下却并不好做,因此他的识别也需要颜色尽量鲜艳,饱和度尽量好的物体,对于背景来讲,也尽量是光线较好、不突变的环境。
(1)对像素点的处理:
摄像头的信息格式是YUV格式的,需要预处理:1、将YUV转为RGB的;2、处理该像素值得到U和V的值。
(2)学习统计:
对感兴趣域的比较统计 ,对于得到的U和V,Pixy将其作为“学习”的依据,即本算法的学习算法均是依靠此处的U和V来进行,得到ratios数组。
(3)、进行“学习”:
由(2)得到的ratios数组表征了用户给定区域的像素在该阈值左右的分布,假定给定一个该分布情况的界限,则阈值就可以根据当前分布与给定分布之间的大小进行自动调整(Pixy默认的界限是80%,即该阈值可以提取出图像区域80%的像素值):以U值为例,当图像在该阈值作用下,大于U阈值最小值的像素点有90%,则说明U阈值的最小值过小,此时应该向下调整,使该阈值增大,反之则反之。
二,特征获取基本思想:
获取特征的函数 track_pic_get(Mat &pic) 和函数 track_get_pic(Mat &mat_temp, Rect &Rect_dst):
/******************************************************************************************************
* 函数(Function): track_pic_get()
* 功能(Description): 用于采集参数
* 调用函数(Calls):cvtColor()、threshold()、bitwise_not()
* 输入参数(parameter):Mat& rgb:RGB三色矩阵
* 返回数值(return): return -1:失败
return 0:成功
* 其他(Others):
********************************************************************************************************/
int track_pic_get(Mat &pic);
/******************************************************************************************************
* 函数(Function): track_get_pic(Mat &mat_temp, Rect &Rect_dst)
* 功能(Description): 用于获取目标图像(切割出目标)
* 调用函数(Calls):findContours()、boundingRect()
* 输入参数(parameter):Mat &mat_temp:原始图像
RotatedRect &Rect_dst:目标图像(旋转矩形)
* 返回数值(return):return=(int)Rect_dst.area():目标矩形面积
* 其他(Others):
********************************************************************************************************/
int track_get_pic(Mat &mat_temp, RotatedRect &Rect_dst); //生成的范围
三,根据特征进行颜色追踪算法
主要是三个函数:追踪函数:track_result(Mat &frame, Point ¢er, Point &w_h);调节范围函数:calcRatios8(Mat& uu, Mat& vv, struct ColorSignature *sig, float ratios[]),特征获取函数:HSVGet_track(Mat& rgb):
/******************************************************************************************************
* 函数(Function): track_result(Mat &mat_temp, Point ¢er,Point &w_h)
* 功能(Description): 获取参数
* 调用函数(Calls):HSVUpdate_track()、findContours()、boundingRect()、minAreaRect()
* 输入参数(parameter):Mat &frame:输入图像
Point ¢er;矩形中心点
Point &w_h:矩形长和宽
* 返回数值(return):return=-1:没有检测轮廓
return=-2:检测到轮廓过小,滤除
return=正数:反馈矩形面积,成功
* 其他(Others): 参数可以调。
********************************************************************************************************/
int track_result(Mat &frame, Point ¢er, Point &w_h);
/******************************************************************************************************
* 函数(Function):calcRatios8(Mat& uu, Mat& vv, struct ColorSignature *sig, float ratios[])
* 功能(Description): 获取参数m_uMean(u平均)、m_vMean(v平均)
* 调用函数(Calls):
* 输入参数(parameter):Mat& uu:图像uu
Mat& vv:图像vv
struct ColorSignature *sig:参数结构体
float ratios[]:4维矩阵
* 返回数值(return): 无
* 其他(Others):
********************************************************************************************************/
void calcRatios8(Mat& uu, Mat& vv, struct ColorSignature *sig, float ratios[]);
/******************************************************************************************************
* 函数(Function): HSVGet_track(Mat& rgb)
* 功能(Description): 获取结构体其他参数m_uMin、m_uMax、m_vMin、m_vMax等
* 调用函数(Calls):cvtColor()、split()、calcRatios8()
* 输入参数(parameter):Mat& rgb:RGB三色矩阵
* 返回数值(return): Mat():处理的矩阵
* 其他(Others): 扩大范围参数range可以调节。
track_have=true;//代表完成参数采集
********************************************************************************************************/
Mat HSVGet_track(Mat& rgb);
四,算法使用过程
相关的使用代码为:track_color_mode/track_color_mode.h,和track_color_mode/track_color_mode.cpp。测试代码为:track_test.cpp
使用步骤为:
1,调节焦距;
2,采集需要注意,尽量靠近物体;
3, 编译命令为:g++ track_test.cpp track_color_mode.cpp uart_io/uart_io.cpp -o track_test -lopencv_core -lopencv_highgui -lopencv_imgproc -lpthread -std=c++11
获取参数代码:
while (1)
{
capture >> frame;
if (frame.data == NULL)
continue;
if (track_pic_get(frame) == 0)//获取参数
break;
}
根据颜色追踪物体代码(UART()函数可以删除,根据情况,自行调整):
while (1)
{
capture >> frame;
if (frame.data == NULL)
continue;
if (track_have)
{
Point center, w_h;
if(track_result(frame, center, w_h)>0)
cout << center.x << " " << center.y << " " << w_h.x << " " << w_h.y << endl;
unsigned char temp[5];
int len=0;
int2char_num(center.x,temp);
len=UART_Send(fd,(unsigned char*)temp,4);//x
int2char_num(center.y,temp);
len=UART_Send(fd,(unsigned char*)temp,4);//y
int2char_num( w_h.x,temp);
len=UART_Send(fd,(unsigned char*)temp,4);//w
int2char_num(w_h.y,temp);
temp[4]='\n';
len=UART_Send(fd,(unsigned char*)temp,5);//h
}
}
具体视觉传感器测试、购买可以咨询:火星人俱乐部官网(https://www.imarsclub.com/web/index),电话或邮件联系即可。传感器已经申请专利,商业使用需要授权。
火星人视觉传感器介绍,参考: https://blog.csdn.net/Bluesyxx/article/details/98474347
火星人视觉传感器是一个开放平台,相关电路版图、代码对外开放,可以自行下载,代码地址:https://github.com/BluesYu/MarStech_Vision_Sensor,欢迎star和fork,有问题可以再github上交流。
本项目为开源项目,不以盈利为目的,开源社区需要大家一起努力,欢迎大家一起来开发!