@windmelon
2018-12-10T13:29:03.000000Z
字数 1725
阅读 2308
智能机器人实验
通过对图像捕捉和颜色特征提取,了解机器视觉的一般工作流程,掌握OpenCV的使用及基本图像处理算法。
Ubuntu 16.04 虚拟机
Python 2.7
OpenCV 3
common.py
video.py
test.py
lan.jpg
其中 video.py 和 common.py 是 opencv 自带的 sample,在 test.py 中会调用 这两个文件,lan.jpg是参考图像文件,用于学习目标的颜色特征
在虚拟机上启动摄像头需要以下步骤
确定主操作系统中装有摄像头驱动之后,进行以下操作
如果虚拟机右上角出现如图所示的摄像头图标,表示连接成功
在虚拟机中进行测试
~$sudo apt-get install cheese
~$cheese
摄像头可以正常使用
使用video.py测试
~$python video.py
成功
进行操作之前,需要了解什么是图像的直方图
图像的直方图又叫灰度直方图,是一个二维的柱状图,横坐标代表灰度级,纵坐标代表该灰度级的频率
那么,灰度又是什么呢?
灰度是指在黑白图像中(也可以叫灰度图像),图像的亮度,在256级灰度图中,灰度为255时图像为白色,灰度为0时图像为黑色
那么彩色图的灰度呢?
彩色图象的灰度其实是在转化为黑白图像后的像素值(是一种广义的提法),转化的方法看应用的领域而定,一般按加权的方法转换,R , G ,B 的比一般为3:6:1
任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:
浮点算法:Gray=R*0.3+G*0.59+B*0.11
整数方法:Gray=(R*30+G*59+B*11)/100
移位方法:Gray =(R*28+G*151+B*77)>>8;
平均值法:Gray=(R+G+B)/3;
仅取绿色:Gray=G;
上述这样只考虑一种特征(即灰度级)的直方图叫一维直方图,因为最终计算得到的是一个一维数组,存放了每个灰度级下的像素个数(频率),然后绘成直方图
那么同时考虑多个特征就能生成多维直方图,如二维直方图
本次实验中二维直方图考虑的两个特征为
每个像素的色调(Hue)和饱和度(Saturation)值
即将RGB图转为HSV中的H和S,二维直方图画出来类似散点图,横纵坐标分别代表H和S,像素值则反应为点的亮度
颜色特征识别的基本流程如下
其中重点就是利用参考图像的直方图对目标图片进行反向投影
它会输出与输入图像(待搜索)同样大小的图像,其中的每一个像素值代表了输入图像上对应点属于目标对象的概率。用更简单的话来解释,输出图像中像素值越高(越白)的点就越可能代表我们要搜索的目标(在输入图像所在的位置)
然后再用camshift算法找到一个概率最大的区域,在此区域绘制椭圆框
如上所述
H(Hue):色调
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
S(Saturation):饱和度
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
V(Value):明度
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。