法兰识别定位,本以为很简单,没想到超出我的认知。
我曾在《机器人系统集成及自动化生产线设计大师》教材里介绍过HALCON视觉软件识别工件的方法,没想到此方法识别法兰时失效了。
- read_image(),图片读取函数;
- rgbl_gray(),灰度处理函数,将彩色图片变成黑白图片,化繁为简;
- threshold(),二值化阈值函数,黑白分界处即是工件轮廓;
- connection(),计算整个图像范围内有多少个连通区域,即获取图片上含有的所有工件;
- select_shape(),获取工件轮廓特征;
- orientation_region (),获取工件朝向,也就是工件的角度;7. area_center (),获取工件中心位置。
由于法兰和背后的管道都是不锈钢材质,颜色几乎一模一样,特征不明显,使用threshold()和select_shape()都无法筛选出想要的区域。
没办法,只能另辟蹊径,连续看了2天HALCON示例程序,终于在cbm_sbm.hdev这个示例程序中发现了find_component_model()函数,find_component_model 函数的功能是在图像里寻找最匹配的元件模型(Find the best matches of a component model in an image)。
有了 find_component_model (),法兰识别立马变得无比简单。
下面是利用find_component_model ()识别法兰位置的HALCON程序代码:
* 读取参照物图像
read_image (ModelImage, ” images/tanker01.jpg”)
dev_open_window_fit_image (ModelImage, 0, 0, -1, -1, WindowHandle)
dev_display (ModelImage)
dev_set_line_width (4)
dev_set_color (”green”)
dev_set_draw (”margin”)
gen_circle (ComponentRegions, 475, 208, 102)
* 创建组件模型(标准参考物)
create_component_model (ModelImage, ComponentRegions, 20, 20, rad(25), 0, rad(360), 15, 40, 15, 10, 0.8, ”auto”, 0, ”none”, ”use_polarity”, ”true”, ComponentModelID, RootRanking)
read_image (SearchImage, ”images/tanker_02.jpg”)
* 查找与标准参考物匹配的模型组件
find_component_model (SearchImage, ComponentModelID, RootRanking, 0, rad(360), 0.5, 0, 0.5, ”stop_search”, ”search_from_best”, ”none”, 0.8, ”interpolation”, 0, 0.8, ModelStart, ModelEnd, Score, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp)
dev_display (SearchImage)
* 显示模型组件
for Match := 0 to |ModelStart| - 1 by 1
dev_set_line_width (1)
get_found_component_model (FoundComponents, ComponentModelID, ModelStart, ModelEnd, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp, Match, ”false”, RowCompInst, ColumnCompInst, AngleCompInst, ScoreCompInst)
*计算组件模型的面积、中心点坐标
area_center (FoundComponents, Area, Row, Column)
gen_circle (Circle, Row, Column, 40)
disp_cross (WindowHandle, Row, Column, 60, AngleCompInst)
*显示组件模型的中心点坐标
disp_message (WindowHandle, ”x=”+Column+” y=”+Row, ”window”, Row/2-60, Column/2-30, ”black”, ”true”)
endfor
HALCON代码导出成C、C#、C++或VE.NET程序代码就可以在电脑上运行了,是不是很简单?
绝大多数的视觉应用其实都不难,无非就是识别个工件而已,学些视觉技术,只要入门,基本上就能满足基本的工作需要了,就像我我们学计算机语音一样,只要能输出“hello world!”,就算入门了。