一、读入一张图片
二、故意设置偏心的ROI(模板)区域,由左上角轮廓图可知,创建时是将ROI区域的中心移动至原点,此时圆心处为
*此时圆心为形状模板的质心位置,而非区域模板的中心位置
area_center_xld (ModelContours, Area, Row1, Column1, PointOrder)
gen_circle (Circle1, Row1, Column1, 3)
dev_display (Circle1)
三、将创建的模板移动至模板创建位置处显示(原点处轮廓可以消除,此处没消去),同时也可以获取创建模板时工件位置坐标
![在这里插入图片描述](https://img-blog.csdnimg.cn/8a3b61d5b3d14a19873d966a0376fa2c.png)
四、令读一张图,做模板匹配
![在这里插入图片描述](https://img-blog.csdnimg.cn/aae449a71467444ea5318329f53b47e5.png)
用find_scaled_shape_model得出的Row, Column处画圆并显示,很明显,此处不是质心,而是模板ROI匹配处的中心位置
![在这里插入图片描述](https://img-blog.csdnimg.cn/0a9cded9fc2a469a879a6cfbf8c41fe1.png)
5、二维矩阵变换,将模板轮廓在匹配处显示,并将转换后轮廓圆心显示(也可以说得此时形状模板质心坐标)
![在这里插入图片描述](https://img-blog.csdnimg.cn/f5be5324300a48e1b9b6786b58b66945.png)
由此,各处各心得位置也就明了。
dev_close_window ()
*read_image (Image, 'C:/Users/连山人/Desktop/物料纠偏/halcon实验/Image_.bmp')
*read_image (Image, 'C:/Users/连山人/Desktop/物料纠偏/halcon实验/Image_01.bmp')
read_image (Image, 'C:/Users/连山人/Desktop/物料纠偏/halcon实验/Image_3.bmp')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_line_width (3)
dev_set_part (0, 0, Height-1, Width-1 )
dev_set_color ('blue')
dev_display(Image)
draw_rectangle2 (WindowHandle, Row, Column, Phi1, Length1, Length2)
gen_rectangle2 (ModelRegion, Row, Column, Phi1, Length1, Length2)
*draw_circle (WindowHandle, Row, Column, Radius)
*gen_circle (ModelRegion, Row, Column, Radius)
reduce_domain (Image, ModelRegion, TemplateImage)
*创建模板时,是将roi区域的中心点移动至像素坐标系(0,0),而不是形状模板的质心移动至原点
create_shape_model (TemplateImage, 'auto', rad(0), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelId)
*ModelId为包含形状模板的区域模板,但当提取轮廓时,只会获得形状模板的轮廓(因为区域模板只有形状模板的轮廓)
get_shape_model_contours (ModelContours, ModelId,1)
dev_set_color ('red')
dev_display (ModelContours)
*此时圆心为形状模板的质心位置,而非区域模板的中心位置
area_center_xld (ModelContours, Area, Row1, Column1, PointOrder)
gen_circle (Circle1, Row1, Column1, 3)
dev_display (Circle1)
stop ()
*创建二维平移矩阵,将形状模板移动到创建模板处显示
hom_mat2d_identity (HomMat2DI)
hom_mat2d_translate (HomMat2DI, Row, Column, HomMat2DT)
affine_trans_contour_xld (ModelContours, ModelContAffTrans, HomMat2DT)
dev_display (ModelContAffTrans)
area_center_xld (ModelContAffTrans, Area, RowT, ColumnT, PointOrder)
gen_circle (CircleT, RowT, ColumnT, 3)
dev_display (CircleT)
stop ()
*——————————————————————————模板匹配————————————————————
*read_image (Image, 'C:/Users/连山人/Desktop/物料纠偏/halcon实验/Image_3.bmp')
read_image (Image, 'C:/Users/连山人/Desktop/图/模板创建实验/Image_20.bmp')
*在scale中查找匹配图形
find_scaled_shape_model (Image, ModelId, 0, 360, 0.9, 1.1, 0.6, 0, 0.5, 'least_squares', 0, 0.9, Row, Column, Anglerad, Scale, Score)
*此时圆心为ROI区域(区域模板)匹配位置的中心(转换过角度),非匹配后形状模板轮廓质心
gen_circle (Circle, Row, Column, 3)
dev_display (Circle)
*——-——转换形状模板轮廓至匹配位置显示————————
*ModelId为包含形状模板的区域模板,但当提取轮廓时,只会获得形状模板的轮廓(因为区域模板只有形状模板的轮廓)
get_shape_model_contours (ModelContours, ModelId,1)
hom_mat2d_identity (HomMat2)
*将缩放添加到齐次二维转换矩阵中,以0,0为基点,进行扩大
hom_mat2d_scale (HomMat2, Scale, Scale, 0, 0, HomMat2)
*将旋转添加到齐次二维转换矩阵中,绕点0,0旋转
hom_mat2d_rotate (HomMat2, Anglerad, 0, 0, HomMat2)
hom_mat2d_translate (HomMat2, Row, Column, HomMat2)
*区域根据齐次二维转换矩阵中的参数要求进行仿射变换,坐标根据括号中参数来设置
affine_trans_contour_xld (ModelContours, TransContours, HomMat2)
dev_display (TransContours)
*转换后为形状模板轮廓实际匹配质心处
area_center_xld (TransContours, Area, Row2, Column2, PointOrder)
gen_circle (Circle2, Row2, Column2, 3)
dev_display (Circle2)
stop ()
另外还有某论坛的开源控件,并且在该控件的基础上新增了文字显示,十字架中心基准,最重要的是“把涂抹功能”集合到了一起,并且测试无bug vs2019可以直接运行,halcon则是使用的18版本。功能有找直线,找圆,形状模板匹配,二维码识别及等级识别,相机内参标定,相机外参标定,以及几何测量。C#联合halcon的demo 直线 找圆 形状模板匹配及等级识别等功能。这个demo无论是学习还是封装都有很好的参考意义,大量节省个人时间。
4.使用方法:用hancon 生成自己相机的连接接口,替换一下就能用
5.本案例使用halcon 12 ,需要高版本的替换一下
6.本案例调试时用,X86,因为用halcon版本
技术支持:咸鱼搜索:ADO六轴机器人
本文主要实现基于C#实现视觉定位的基础框架,与前面的python版、MFC版、Qt版一样,可供不同的开发者进行学习使用。
本文也是包括多模板算法匹配:基于形状、基于灰度、基于相关性、基于可变比例等。
编程环境:dotnet4.7
halcon20.05
IDE: VisualStudio 2022本次项目的效果视频:
从项目文件内容可以分为:
1、界面Calibration:这里是相机标定(像素坐标与机器人坐标映射)
2、界面CameraSetting:这里是相机设置(连接相机并把图像传递到主界面)
Halcon模板匹配算子find_shape_model里的参数Row, Column, Angle含义是什么?
find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, ...
Halcon模板匹配是工程上使用必不可少的。用途可定位,可查找,可识别,非常灵活下面开始:模板匹配是通过计算模板与图像之间的相似度实现的完整性检测/物体识别/得到位姿位姿刚性变换:平移和旋转方向的变换相似变换:平移和旋转和缩放方向的变换Halcon匹配共三种:Component-Based:基于组件成分和元素Gray-Value-Based:基于灰度值Shape-Based:基于形状shape_m...
本文将讲解halcon中的数据类型,图像变量Object:Image和Region。具体内容目录如下:1、Object简介2、Image介绍(1)read_image算子(2)图像像素值查看3、Region介绍(1)threshold算子(2)查看Region上节讲述了变量窗口的控制变量,这节讲述图像变量。简单来说图像变量就是可以直观的在图形窗口显示出来,双击对应图像变量即可显示。1...
初学者看到draw_circle这样的语句,可能会一头雾水;无法找到此语句的正确执行,我本人曾经以为是被淘汰的语句。此语句的语法是draw_circle (3600, Rowx, Columnx, Radius)其中,你给上面任何一个变量赋值,将出现语法错误。...
color24 := [255,0,0]
color8 := 255
gen_region_contour_xld (UnionContoursCircles, Region1, 'filled')
region_to_bin(Region, Binary, 0, 255, Width, H...
https://blog.csdn.net/ruotianxia/article/details/81638552
https://blog.csdn.net/daybreak___/article/details/82822090
在图像处理方面,halcon比较方便,不需要自己写太多的代码,也有例程可以学习,所以就想要尝试一下将halcon的程序导出后用在基于C#的上位机中。