嵌入式AI设备--火星人视觉传感器--颜识别功能

阅读: 评论:0

嵌⼊式AI设备--⽕星⼈视觉传感器--颜⾊识别功能
颜⾊识别功能是⽕星⼈视觉传感器的基本的功能,现有视觉传感器颜⾊识别距离有限,不适⽤于多颜⾊场景。针对这些问题,本传感器采⽤改进的数字图像处理算法,能完成多个物体颜⾊识别,提升准确率。处理过程分为三个步骤:图像预处理、颜⾊识别和识别结果滤波。基本原理是利⽤HSV域的特性,对图像进⾏处理。
HSV(⾊调、饱和度、亮度)参数与颜⾊对应的关系,本传感器做了轻微的调整。
参数⿊⾊
(BK)灰⾊
(GY)
⽩⾊
(WT)
红⾊
(RD)
橙⾊
(OG)
黄⾊
(YL)
绿⾊
(GN)
青⾊
(DKGN)
蓝⾊
(BU)
紫⾊
(PL)
hmin00001561126357890125
hamx1801801801018025347799124155
smin00043434343434343
smax2554330255255255255255255255
vmin04622146464646464646
Vmax46220255255255255255255255255
⼀,图像预处理
图像预处理分为三个步骤:去噪、图像增强、转换颜⾊模型三个步骤。作为备选⽅案,去噪可以推荐使⽤(快速中值滤波算法+双边滤波算法)的组合滤波算法,⽰例代码没有使⽤。
图像增强推荐使⽤拉普拉斯图像增强,对图像进⾏锐化处理。
图像处理完成之后,从RGB域转换到HSV域,具体的⽅法如下所⽰:
⼆,颜⾊识别算法
颜⾊识别可分为两个步骤:图像颜⾊遍历和物体轮廓查。⾸先根据HSV(⾊调、饱和度、亮度)模型中的⾊度数值,对颜⾊进⾏分类,对10种颜⾊进⾏分类,但是由于环境中背景⼀般采⽤⿊、灰、⽩三种颜⾊,因此不检测该三种颜⾊,将此三种颜⾊点成为背景点,其他的为颜⾊点。同时橙⾊和青⾊容易被认为是黄⾊和蓝⾊,为了增加传感器使⽤的可靠性,避免造成误解,仅仅检测五种颜⾊:红⾊、黄⾊、绿⾊、蓝⾊和紫⾊。
三、结果滤波算法
使⽤测试视频,测试结果如下:
通过上图可以看到,因此需要采⽤结果滤波算法来去除⼤量的噪点,因此需要使⽤结果滤波算法,结果滤波算法如下所⽰,其中AB代表传感器⾼度,视觉传感器位置在A点,视觉传感器摄像头识别⾓度为60度,默认垂直地⾯放置,⽽A点与球体切线的与球体相交的点为C、D,假设 AB=10cm(即传感器离地⾯有10cm),BC=200cm,根据⼏何原理得到⾓DAB为90度,则计算⾓度α 。通过⽐例换算,可知传感器图像中球体在42*42像素的⼤⼩范围内。因此设计滤波算法,通过轮廓检测后,将矩形轮廓尺度⼩于42*42像素的物体直接滤除。
四,代码结构
1,需要使⽤摄像头;
2,采集图像信息,通过串⼝发送;
3,依赖简易的opencv库函数,可以使⽤⽩平衡算法;立磨衬板
4, 测试函数编译命令为:g++ color_mode_test.cpp color_mode.cpp uart_io.cpp -o color_mode_test -lopencv_core -
lopencv_highgui -lopencv_imgproc -lpthread -std=c++11
代码主体为和,测试代码为,⽤来测试颜⾊识别功能,代码中有详细的注释。
* 函数(Function):find_color(Mat &src, vector<string> &color_name,vector<Rect> &rect_dst, string color) * 功能(Description):查⽬标图⽚的轮廓,标记颜⾊
* 调⽤函数(Calls):findContours()等
* 输⼊参数(parameter):Mat &src:输⼊图像
箱式高温煅烧炉
vector<string> &color_name:保存轮廓的颜⾊数组
vector<Rect> &rect_dst:保存轮廓矩形数组
string color:颜⾊标记
* 返回数值(return): -1:检测失败,即没有轮廓
正数:轮廓的个数
* 其他(Others):可以添加形态学处理算法
********************************************************************************************************/
int find_color(Mat &src, vector<string> &color_name, vector<Rect> &rect_dst, string color);
/******************************************************************************************************
* 函数(Function):expand_color_image(Mat &srcImg, Mat &dstImg)
* 功能(Description):对图像进⾏形态学处理
* 调⽤函数(Calls):erode(),dilate()等
* 输⼊参数(parameter):Mat &srcImg:输⼊图像
Mat &dstImg:输出图像
变压器蝶阀
* 返回数值(return):⽆
* 其他(Others):可以修改形态学处理算法模板⼤⼩
********************************************************************************************************/
人工智能垃圾桶void expand_color_image(Mat &srcImg, Mat &dstImg);
/******************************************************************************************************
* 函数(Function)get_color_pic(Mat &src, Mat &RD, Mat &YL, Mat &GN, Mat &BU, Mat &PL)
* 功能(Description):获取五种颜⾊的模板
* 调⽤函数(Calls):cvtColor(),get_color_num()等
* 输⼊参数(parameter):Mat &src:输⼊图像  Mat &RD:红⾊
*          Mat &YL:黄⾊        Mat &GN:绿⾊
*          Mat &BU:蓝⾊        Mat &PL:紫⾊
* 返回数值(return): return =-1:检测失败,参数范围溢出
*                    return = 0:检测成功
* 其他(Others):图像的参数:S(饱和度)和V(明度),范围可以调节,主要⽤于调节背景颜⾊(⿊、⽩、灰)********************************************************************************************************/
int get_color_pic(Mat &src, Mat &RD, Mat &YL, Mat &GN, Mat &BU, Mat &PL);
/******************************************************************************************************
* 函数(Function):  get_color_num(int &num)
* 功能(Description):根据H(⾊调)数值,判断对应的颜⾊区间
* 调⽤函数(Calls):⽆
* 输⼊参数(parameter):int &num:输⼊H(⾊调)数值。
* 返回数值(return):    return =-1:检测失败,五种颜⾊
*                        return = 1:红⾊
*                        return = 2:黄⾊
*                        return = 3:绿⾊
*                        return = 4:蓝⾊
*                        return = 5:紫⾊
* 其他(Others):默认的阈值是:h_min[6] = { 0,156,30,35,105,125 };
h_max[6] = { 8,180,34,77,124,155 };
阈值范围可以调节。
********************************************************************************************************/
对扣int get_color_num(int &num);
* 函数(Function):get_color_mode(Mat &framem, vector<string> color_name, vector<Point> Rect_center, vector<Point> Rect_size) * 功能(Description):获取五种颜⾊的模板
* 调⽤函数(Calls):get_pic(),find_color()等
* 输⼊参数(parameter):Mat &frame:输⼊图像
*                        vector<string> &color_name:检测颜⾊数组
*          vector<Point> &Rect_center:对应中⼼坐标
*          vector<Point> &Rect_size:矩形尺⼨(长和宽)
* 返回数值(return):    return =-1:图像获取失败合同比对
*                        return =-2:未监测到轮廓
*                        return = 正数:检测得到参数
* 其他(Others):
********************************************************************************************************/
int get_color_mode(Mat &frame, vector<string> &color_name, vector<Point> &Rect_center, vector<Point> &Rect_size);
参考代码⽰例在中,直接调⽤库函数即可。
vector<string> color_name;
vector<Point> Rect_center;
vector<Point> Rect_size;
if (get_color_mode(frame, color_name, Rect_center, Rect_size) > 0)
{
...
}
使⽤打印函数,打印出具体的位置(颜⾊名称、中⼼点坐标、矩形区域长宽)即可,代码如下:
strcpy(color_temp,color_name[i].c_str());
color_temp[2]=' ';
len=UART_Send(fd,(unsigned char*)color_temp,3);//颜⾊
unsigned char temp[5];
int2char_num(Rect_center[i].x,temp);
len=UART_Send(fd,(unsigned char*)temp,4);//x
int2char_num(Rect_center[i].y,temp);
len=UART_Send(fd,(unsigned char*)temp,4);//y
int2char_num(Rect_size[i].x,temp);
len=UART_Send(fd,(unsigned char*)temp,4);//w
int2char_num(Rect_size[i].y,temp);
temp[4]='\n';
len=UART_Send(fd,(unsigned char*)temp,5);//h
本项⽬为开源项⽬,不以盈利为⽬的,开源社区需要⼤家⼀起努⼒,欢迎⼤家⼀起来开发!

本文发布于:2023-05-27 08:35:35,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/115743.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:算法   图像   传感器
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图