[关闭]
@windmelon 2018-12-10T13:29:03.000000Z 字数 1725 阅读 2308

智能机器人实验(一):基于OpenCV的颜色特征识别

智能机器人实验


实验目的

通过对图像捕捉和颜色特征提取,了解机器视觉的一般工作流程,掌握OpenCV的使用及基本图像处理算法。

实验内容

  1. 图像传感器驱动应用
  2. 图像直方图生成
  3. 颜色特征设定及目标识别

实验平台和工具

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是参考图像文件,用于学习目标的颜色特征

实验步骤

1.图像传感器驱动应用

在虚拟机上启动摄像头需要以下步骤

确定主操作系统中装有摄像头驱动之后,进行以下操作

image.png-113kB

如果虚拟机右上角出现如图所示的摄像头图标,表示连接成功

image.png-9.2kB

在虚拟机中进行测试

~$sudo apt-get install cheese

~$cheese

image.png-385.8kB

摄像头可以正常使用

使用video.py测试

~$python video.py

image.png-153kB

成功

2.图像直方图生成

进行操作之前,需要了解什么是图像的直方图
图像的直方图又叫灰度直方图,是一个二维的柱状图,横坐标代表灰度级,纵坐标代表该灰度级的频率

image.png-59.9kB

那么,灰度又是什么呢?

灰度是指在黑白图像中(也可以叫灰度图像),图像的亮度,在256级灰度图中,灰度为255时图像为白色,灰度为0时图像为黑色

那么彩色图的灰度呢?

彩色图象的灰度其实是在转化为黑白图像后的像素值(是一种广义的提法),转化的方法看应用的领域而定,一般按加权的方法转换,R , G ,B 的比一般为3:6:1

任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:

  1. 浮点算法:Gray=R*0.3+G*0.59+B*0.11

  2. 整数方法:Gray=(R*30+G*59+B*11)/100

  3. 移位方法:Gray =(R*28+G*151+B*77)>>8;

  4. 平均值法:Gray=(R+G+B)/3;

  5. 仅取绿色:Gray=G;

上述这样只考虑一种特征(即灰度级)的直方图叫一维直方图,因为最终计算得到的是一个一维数组,存放了每个灰度级下的像素个数(频率),然后绘成直方图

那么同时考虑多个特征就能生成多维直方图,如二维直方图
本次实验中二维直方图考虑的两个特征为

每个像素的色调(Hue)和饱和度(Saturation)值

即将RGB图转为HSV中的H和S,二维直方图画出来类似散点图,横纵坐标分别代表H和S,像素值则反应为点的亮度

image.png-24.2kB

3.颜色特征设定及目标识别

颜色特征识别的基本流程如下

process.png-21.9kB

其中重点就是利用参考图像的直方图对目标图片进行反向投影

它会输出与输入图像(待搜索)同样大小的图像,其中的每一个像素值代表了输入图像上对应点属于目标对象的概率。用更简单的话来解释,输出图像中像素值越高(越白)的点就越可能代表我们要搜索的目标(在输入图像所在的位置)

然后再用camshift算法找到一个概率最大的区域,在此区域绘制椭圆框
image.png-154.7kB

实验总结

什么是直方图?

如上所述

HSV的维度?

H(Hue):色调

用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

S(Saturation):饱和度

饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

V(Value):明度

明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

image.png-85.7kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注