赞
踩
今天,就让我们来看看魔方的颜色识别是如何做到的。做图像处理的话我们可以用OpenCV(用到了颜色空间的转换RGB转HSV以及ROI区域提取),全称为Open Source Computer Vision Library,直译为“开源计算机视觉库”。我用的版本为3.0。
先来说说我做颜色识别的思路:在介绍魔方机器人的那篇博客中我们可以看到魔方在整个机器人中的相对位置是固定的,也就是说我们可以在图像确定的位置去提取颜色而不用去做轮廓识别啊什么的,这就叫所谓的定点颜色识别,但是在每个色块只提取一个像素点肯定是不行的,所以还需要做一些处理。那么问题来了,如何将图片采集到计算机中,当然是通过摄像头了,那么要用几个摄像头呢?我的建议是三个,虽然我们都知道一个摄像头同时最多能捕捉到到魔方的三个面,既然最多同时能捕捉到魔方的三个面那为什么不用两个摄像头呢?这是因为基于做颜色识别的方法,只有两个摄像头采集出来的图像做ROI不是很方便,因此我用了三个,每个摄像采集魔方的两个面。大概思路就是这样,接下来我详细和大家说说具体的实现。
每个摄像头所提取的图像都像这样处理(最后的到的是六张图像)。
cvtColor(srcImage, hsvImage, COLOR_BGR2HSV);
//srcImage为原始图像,hsvImage为转换后的图像,COLOR_BGR2HSV的意思为BGR转HSV。
之后
double h,s,v;
Point A;
A = Point(x, y);//x,y对应该像素点在图像中的位置
h = hsvImage.at<Vec3b>(A)[0];//得到H的数值
s = hsvImage.at<Vec3b>(A)[1];//得到S的数值
v = hsvImage.at<Vec3b>(A)[2];//得到V的数值
以上得出的只是单个像素点的H,S,V数值,我们需要取对应色块上更多的像素点H,S,V值然后计算器平均值然后再去判断其色块的颜色,具体怎么去取,用什么方式去计算均值得由自己去定义。假设我们已经得出了48个色块的s,h,v数值,之后就是进到颜色匹配的方法中,用每个色块的s,h,v范围去匹配颜色,经过颜色匹配后会输出一串序列,这个序列就是所谓的打乱序列。
各种颜色对应的hsv范围大家最好根据自己的实际情况多测试几遍之后再放到你的方法中比较好。这里我放一个我测试得出的hsv数值范围(仅供参考):
黄 | 白 | 蓝 | 绿 | 红 | 橙 | |
---|---|---|---|---|---|---|
hmin | 28 | 0 | 80 | 44 | 125 | 3 |
hmax | 44 | 180 | 124 | 77 | 180 | 28 |
smin | 43.6 | 0 | 43.6 | 43.6 | 43.6 | 43.6 |
smax | 255 | 43.5 | 255 | 255 | 255 | 255 |
vmin | 46 | 46 | 46 | 46 | 46 | 46 |
vmax | 255 | 255 | 255 | 255 | 255 | 255 |
核心部分就是颜色识别还有还原算法这两部分,把这两个部分搞定也就完成了整个机器人的百分之八十了。
至此,就是机器人整个颜色识别的部分了。
魔方机器人(基于OpenCV、Arduino)
一.魔方机器人(一)还原算法
三.魔方机器人(三)Arduino
四.魔方机器人(四)总结
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。