Halcon魔方颜色识别
作者:牛 羽 含
关键词:机器视觉、颜色识别、Halcon
以下是基于Halcon视觉识别魔方各个表面颜色的示例:
一、图像采集
连接相机或直接输入图片。对于魔方这种相对较小的物体,需要选择分辨率合适的相机,确保魔方在图像中能清晰呈现,避免因分辨率过低导致颜色细节丢失或因分辨率过高而产生大量数据冗余。比如合适的工业相机(如USB相机、网口相机等),通过相应的Halcon支持的图像采集接口,在Halcon环境中完成相机的连接与初始化,使得获取图像。
1.相机的连接代码示例:
open_framegrabber ('MediaFoundation', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'LRCP_USB2.0_vid_0bda&pid_3035&mi_00 #7&297f3732&0&0000', 0, -1, AcqHandle)
2.输入图片文件代码示例:
list_files('C:/Users/Public/Documents/MVTec/HALCON-23.11-Progress/examples/images/mofang.1/', ['files','follow_links'], ImageFiles)
注意:拍摄魔方图像时,要保证魔方测量面完整的出现在图像视野,并且光照条件稳定,避免其余因素影响颜色识别,以下过程使用图片进行演示,相机识别魔方颜色过程与图片类似。
二、图像预处理
1.灰度处理
当采集到魔方的彩色图像后,可先使用灰度处理将其转换为灰度图像,以便进行一些初步的操作,如使用灰度图像进行图像质量评估、噪声评估等。例如,可以通过分析灰度图像的直方图来查看图像的对比度是否足够,是否存在过亮或过暗的区域,以及噪声的分布情况。
代码示例:
rgb1_to_gray(Image,GrayImage)
图1 灰度图像
2.滤波去噪
运用滤波算子去除图像中的噪音点,目的是解决采集图像过程中混入的一些椒盐噪音等干扰因素,提高采集图像质量,让后续的图像识别更精确。
代码示例:
median_image(Image, ImageMedian, 3)
3.对比度增强(可选)
当采集到魔方的图像后,由于光照、背景等因素的影响,魔方表面颜色的对比度可能不够理想,影响后续的颜色分割和识别。使用对比度增强可以改善这种情况。
代码示例:
scale_image_max(Image, ImageEnhanced)
*显示对比度增强的图像
disp_image(ImageEnhanced)
三、颜色空间转换
1.选择合适的颜色空间
常用的如 HSV(色调、饱和度、明度)颜色空间,相较于 RGB 颜色空间,它在颜色区分和识别上对于人类视觉感知更符合直觉,更便于分割不同颜色区域。可以使用 trans_from_rgb 这类算子将 RGB 图像转换为 HSV 图像。
2.确定颜色范围阙值(建议使用)
对于魔方常见的颜色(比如红、蓝、绿、黄、白、橙等),在 HSV 颜色空间下,通过实验或者参考一些标准的颜色范围表,确定每个颜色对应的色(H)、饱和度(S)、明度(V)的取值范围。例如,红色可能在某个特定的 H 范围、合适的 S 和 V 区间内。
四、颜色判断
构造一个自定义函数panduancolor,来判断颜色。
函数是根据灰度值构造的(仅适用颜色转变为灰度值不重叠的对象),代码如下:
if (curValue==173)
disp_message (winHandle, '绿色', 'Image', row, col, 'black', 'true')
endif
if (curValue>109 and curValue<113)
disp_message (winHandle, '红色', 'Image', row, col, 'black', 'true')
endif
if (curValue>183 and curValue<188)
disp_message (winHandle, '橘色', 'Image', row, col, 'black', 'true')
endif
if (curValue>221 and curValue<225)
disp_message (winHandle, '黄色', 'Image', row, col, 'black', 'true')
endif
if (curValue>91 and curValue<99)
disp_message (winHandle, '蓝色', 'Image', row, col, 'black', 'true')
endif
if (curValue>253)
disp_message (winHandle, '白色', 'Image', row, col, 'black', 'true')
endif
return ()
以上范围根据自己实际情况来定,根据魔方面颜色设置。
五、代码展示与结果输出
1.整体代码展示
*关闭之前已经打开的窗口
dev_close_window()
*打开新的图像显示窗口
dev_open_window(0, 0, 300, 300, 'black', WindowHandle1)
*图片文件夹替换成自己存放魔方图片的文件夹
list_files('C:/Users/Public/Documents/MVTec/HALCON-23.11-Progress/examples/images/mofang.1/', ['files', 'follow_links'], ImageFiles)
*筛选出图像文件
tuple_regexp_select(ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$', 'ignore_case'], ImageFiles)
*遍历图像文件
for Index := 0 to |ImageFiles| - 1 by 1
read_image(Image, ImageFiles[Index])
rgb1_to_gray(Image, GrayImage)
threshold(GrayImage, Region, 90, 255)
connection(Region, ConnectedRegions)
*圆形腐蚀操作
erosion_circle(ConnectedRegions, RegionErosion, 10.5)
*显示原始图片
dev_display(Image)
count_obj(RegionErosion, Number)
for i := 1 to Number by 1
select_obj(RegionErosion, obj, i)
area_center(obj, Area, Row, Colum)
intensity(obj, GrayImage, Mean1, Deviation)
*判断函数panduancolor
panduancolor(Mean1, Row, Colum, WindowHandle1)
endfor
stop()
endfor
2.可视化展示
利用 Halcon 的可视化显示功能,将原始图像、处理后的图像(如分割出颜色区域的图像)等显示出来,直观地看到识别的效果,可以使用 disp_image 等算子进行图像显示操作。
以下展示了魔方两个面图片的输出图像,其他四个面与下图输出格式相同。
图2 输出魔方面
图3 输出魔方面
使用 Halcon 进行魔方表面颜色识别需要综合考虑图像采集、处理、颜色分割、特征提取等多个环节,通过不断调试和优化各个步骤的参数及操作,来实现准确、高效的颜色识别。对于可能出现的异常情况,如光照突然变化、魔方表面反光、部分颜色区域遮挡等,需要考虑相应的处理策略,以确保识别系统在各种复杂条件下仍能正常工作。