人工智能视觉:AINECC 颜色模型在边缘检测中的应用






4.94/5 (11投票s)
人工智能视觉:AINECC色彩模型在边缘检测中的应用。完全使用OpenCV编写的代码。
- 下载源代码 - 145.15 KB
- 下载可执行文件 - 2.06 MB
- 下载 Microsoft Visual C++ Redistributable 2008 (建议从Microsoft官网下载) - 1.71 MB

引言
当一个系统(自然或人工)试图从场景背景中提取一个物体时,会遇到一些问题:“背景减除”。
最古老的方法之一(在软件工程师出现之前),是假设物体(或其一部分)具有恒定波长反射(颜色)的区域。
AINECC是一个个人项目,在某些主题上非常复杂,它以一种不同的方式来应对计算机视觉理论,构建一个智能且具有演进性的系统。其目标是当一个低成本的机器人手臂连接到网络摄像头时,能够自己将棋盘上的棋子从盒子里放到正确的位置。
此处展示的代码只是其一部分,是为了教育目的而提取的。
该代码包含了一个新的色彩模型,一个用于背景减除第一步的算法,以及两种常用的边界检测方法:Sobel算子和相邻像素的最大差值。
色彩模型
“色彩模型”是一种数学方法,用于描述电子传感器捕获的光线的颜色。
根据不同的用途,存在许多色彩模型。通常,研究人员追求的是获得最佳的色彩准确性。
大多数色彩模型的算法都有反向公式,但对于本项目,为了改进结果,这方面没有被考虑。
基本上,AINECC项目使用的色彩模型是将每个线性的RGB颜色范围转换为一个切线曲线RGB,并归一化到范围:实数(0,1)。
xc = aTan(x/(y*z))/(Pi/2) (参见下文红色通道的3D曲线)
第一个问题是如何从物体中获取颜色。
通常的做法是将RGB值转换为HSV(色调、饱和度、明度),其中色调提供了颜色值。
在不受光照影响的情况下提取物体均匀颜色的最佳方法可能是处理每个像素的RGB向量:R(rx,ry,rz), G(gx,gy,gz), B(bx,by,bz);这非常困难。还有许多其他研究致力于解决这个问题并聚焦于此。
本项目提出的想法是,可以使用简单的除法来获得颜色之间的真实关系。
第二个问题是噪声。
当RGB值较低或接近白色时,色调提取通常会受到噪声的影响。
本项目试图通过反转亮度级别但保持颜色级别不变的方向来解决这个问题。
源代码完全基于opencv 库 2.0,包括图像和视频捕获。OpenCV 在尝试管理相机设置或视频格式时显得比较弱,但另一方面,得益于OpenCV,捕获或提取图像或帧非常简单,当然,它在处理捕获的图像方面也非常强大。
如果您需要更多功能,可以尝试 DirectDraw
(微软示例:amcap 源代码)。
Using the Code
此代码是在 MFC (Microsoft Foundation Classes) 平台下使用 opencv (Open Computer Vision Library) 开发的。
该应用程序有一个主对话框。这个主对话框有3个窗口:源图像、色彩模型和边缘检测。
下面我们来解释运行该应用程序的代码。
运行应用程序的步骤
- 第一步 – 测试配置参数(或调整它们)
- 第二步 – 点击 [打开视频]
- 第三步 – 实时调整色彩模型和边缘参数
- 第四步 – 点击 [关闭视频] 或 [退出] 来关闭或退出应用程序
配置参数
在源图像窗口下方,有一些参数用于“相机”或“图像”配置。
- 相机
宽度、高度和帧率 (FPS) 是典型的相机设置参数。如果您运气好,帧率可能会达到您相机的实际帧率,否则,在对话框启动后会显示30。
我不知道如何仅使用opencv 来获取正确的“宽度”和“高度”值,不过这个问题并不困扰我,因为如果输入了错误的数据,相机就会更改参数为已连接的相机,然后实际结果会覆盖“编辑控件”,这样就可以工作了。请记住使用DirectDraw
来改进相机控制。
色彩模型是“只读”参数。该代码仅适用于 RGB 8U (RGB24) 摄像头,包括网络摄像头。 - Image
实际上有两个图像:色彩模型和边缘检测。通过输入“宽度”和“高度”参数,可以改变要处理的图像的大小。这有助于减少“处理器负载”并提高每秒帧数 (FPS) 的读取速度。
“颜色”会影响两个图像。 - 3RGB->1BW 8: (色彩 => RGB 8U, 边缘 => BW 8U)。“边缘”在每个通道上独立检测,然后混合成一个。
- RGB 8U: (色彩 => RGB 8U, 边缘 => RGB 8U)。“边缘”在每个通道上独立检测,并在RGB图像中显示。
- BW 8U: (色彩 => BW 8U, 边缘 => BW 8U)。此模式模拟黑白相机 (BW)。“色彩”和“边缘”图像都在一个灰度通道中处理。
“配置参数”可以在视频关闭时设置。当视频打开时,这些值会被相机测试,最终被锁定。
打开视频
点击 [打开视频] 后,应用程序就启动了。实际上,代码“封装”在函数“OnBnClickedButtonOpenVid
”中。
为了保持该函数运行,使用了“While(1)
”循环。
在该函数内部,有跳转到3个算法的逻辑。
//
ainGetColor8U( IplImage* srcCo8Uarr, IplImage* dstCo8Uarr, int code);
ainGetDifer8U( IplImage* srcDifArr, IplImage* dstDifArr, int code);
aiSobel8UC3( CvArr* src, CvArr* dst, int xorder,
int yorder, int aperture_size CV_DEFAULT(3));
//
ainGetColor8U
和 ainGetDifer8U
是使用opencv 的“新手模式”创建的,而 aiSobel8UC3
是使用 opencv 开发人员的方式创建的。我无法检测到处理器负载的差异,也许您会。
ainImgInCVWnd
是一个辅助函数。此函数获取“图像”并调整其大小以适应并在其窗口中显示。
屏幕截图
捕获的图像示例。
来源
环境
房间照明:300 Lux
物体照明:一个聚光灯 1000 lux
色彩模型 RGB 8U
边缘检测。
当中心像素周围的像素差值高于2%时,在边缘图像的相应位置放置一个黑点,该点对应于分析过的像素。
色彩模型 RGB 转 BW。
这种色彩模式在单独分析红色、绿色和蓝色时非常有用,也就是说,当只处理主导颜色时。
这种模式最适合计算机视觉。
以及它的 Sobel 结果