精易论坛

标题: 易语言开发视觉双相机定位分享 [打印本页]

作者: 高庞    时间: 2024-6-7 22:44
标题: 易语言开发视觉双相机定位分享
如果有热度就分享源代码
结合halcon19版本开发
  
如果真 (打开所有相机 = 10)
延时 (10)
hal.复制图像 (相机1图片, Image)
图像预处理1 ()
' hal.设置模型参数 (模板句柄, “timeout”, 100)
左边结果 = hal.单模型寻找不同形状 (Image, 模板句柄, 0, 360, 0.9, 1.1, 0.9, 1.1, 到小数 (编辑框12.内容), 1, 0.5, “least_squares”, 到整数 (编辑框11.内容), 0.9, 返回Y, 返回X, 返回角度, , , 返回分数)
' 左边结果 = hal.寻找形状匹配模型 (Image, 模板句柄, 0, 360, 到小数 (编辑框12.内容), 1, 0.5, “least_squares”, 到整数 (编辑框11.内容), 0.9, 返回Y, 返回X, 返回角度, 返回分数)
如果 (hal.弧度到角度 (返回角度).取元组小数 () > 90)
角度转换 = hal.弧度到角度 (返回角度).取元组小数 () - 360
角度转换 = hal.弧度到角度 (返回角度).取元组小数 ()

如果真 (左边结果 = 0)
' hal.求点和角到刚性仿射变换 (0, 0, 0, 返回Y, 返回X, 返回角度, 矩阵左)
' hal.仿射变换XLD (模板轮廓, 临时轮廓, 矩阵左)
hal.创建矩形 (临时矩形, 返回Y, 返回X, 返回角度, 400, 400)
编辑框4.内容 = 到文本 (角度转换)
编辑框5.内容 = 到文本 (返回X.取元组小数 ())
编辑框6.内容 = 到文本 (返回Y.取元组小数 ())
编辑框7.内容 = 到文本 (到数值 (编辑框5.内容)到数值 (编辑框500.内容))
编辑框8.内容 = 到文本 (到数值 (编辑框6.内容)到数值 (编辑框600.内容))
编辑框902.内容 = 到文本 (到数值 (编辑框4.内容)到数值 (编辑框900.内容))
编辑框602.内容 = 编辑框8.内容
编辑框502.内容 = 编辑框7.内容
如果真 (返回Y.取元组小数 () ≠ 0 返回X.取元组小数 () ≠ 0)
延时 (10)
线程ID1 = 线程_启动 (&找交点)
临时矩形.显示 (窗口ID)


i支持库列表   支持库注释   
ehalcon_ch(未知支持库)


  
' 找交点代码
如果真 (左边结果 ≠ 2)
' hal.清除窗口 (WindowHandle)
' hal.dev打开窗口 (0, 0, 图片框1.宽度, 图片框1.高度, “black”, WindowHandle)
hal.复制图像 (Image, Image2)
hal.取图像的尺寸 (Image2, Image高, Image宽)
hal.显示图像局部 (WindowHandle, 0, 0, Image宽, Image高)
hal.RGB1转灰度 (Image2, Image2)
' hal.读取图像 (Image2, “E:/视觉软件/halcon案例/halcon案例/08Halcon卡尺找边/2.png”)
hal.设置颜色 (WindowHandle, “red”)
hal.显示图像对象 (Image2, WindowHandle)
hal.取图像的尺寸 (Image2, Image高, Image宽)
hal.设置线宽 (WindowHandle, 2)
Row1 = hal.取整数 (到小数 (编辑框17.内容)到小数 (编辑框8.内容))
Column1 = hal.取整数 (到小数 (编辑框18.内容)到小数 (编辑框7.内容))
Row2 = hal.取整数 (到小数 (编辑框19.内容)到小数 (编辑框8.内容))
Column2 = hal.取整数 (到小数 (编辑框20.内容)到小数 (编辑框7.内容))
' hal.交互绘直线 (WindowHandle, Row1, Column1, Row2, Column2)
hal.赋值 (Line, hal.创建元组 (Row1, Column1, Row2, Column2))
hal.创建计量模型 (MetrologyHandle)
hal.设置计量模型图像大小 (MetrologyHandle, Image高, Image宽)
hal.添加计量对象通用 (MetrologyHandle, “line”, Line, 20, 5, 1, 15, hal.创建元组 (), hal.创建元组 (), Index)
hal.应用计量模型 (Image2, MetrologyHandle)
hal.取计量对象测量 (Contours, MetrologyHandle, “all”, “all”, Row, Column)
hal.创建十字XLD轮廓 (Cross, Row, Column, 1, 0.785398)
hal.取计量对象结果 (MetrologyHandle, “all”, “all”, “result_type”, “all_param”, Parameter)
hal.取计量对象模型轮廓 (Contour, MetrologyHandle, “all”, 1.5)
hal.清除计量模型 (MetrologyHandle)
' *拟合成直线
hal.创建多边形XLD轮廓 (Contour5, Row, Column)
hal.XLD轮廓拟合直线 (Contour5, “tukey”, -1, 0, 5, 2, RowBegin1, ColBegin1, RowEnd1, ColEnd1, Nr1, Nc1, Dist1)
' *这里主要是为了算角度
hal.线位置 (RowBegin1, ColBegin1, RowEnd1, ColEnd1, RowCenter, ColCenter, Length, Phi)
' *算角度
hal.赋值 (radian, Phi)
hal.赋值 (degree, hal. (hal. (radian, 180), 3.1415926))
编辑框2302.内容 = 到文本 (degree.取元组小数 ())
' *这个步骤才是构造无限长度直线
hal.XLD轮廓拟合直线 (Contour5, “tukey”, -1, 0, 5, 2, Row11, Column11, Row22, Column22, Nr1, Nc1, Dist1)
' hal.显示图像对象 (Contour5, 窗口ID)
' *特殊情况水平线
判断 (hal.等于 (hal. (Row22, Row11), 0))
hal.赋值 (k, 0)
hal.创建多边形XLD轮廓 (Contour, hal.创建元组 (Row22, Row22), hal.创建元组 (0, Image高))
k = hal.取整数 ( (Column22.取元组小数 () - Column11.取元组小数 ()) ÷ (Row22.取元组小数 () - Row11.取元组小数 ()))
hal.赋值 (b, hal. (Column22, hal. (k, Row22)))
hal.赋值 (Row1, 0)
hal.赋值 (Row2, hal. (Image宽, 1))
hal.赋值 (col1, hal. (hal. (k, Row1), b))
hal.赋值 (col2, hal. (hal. (k, Row2), b))
hal.创建多边形XLD轮廓 (Contour, hal.创建元组 (Row1, Row2), hal.创建元组 (col1, col2))

hal.显示图像对象 (Contour, 窗口ID)
' hal.交互绘直线 (WindowHandle, Row111, Column111, Row222, Column222)
Row111 = hal.取整数 (到小数 (编辑框21.内容)到小数 (编辑框8.内容))
Column111 = hal.取整数 (到小数 (编辑框22.内容)到小数 (编辑框7.内容))
Row222 = hal.取整数 (到小数 (编辑框23.内容)到小数 (编辑框8.内容))
Column222 = hal.取整数 (到小数 (编辑框24.内容)到小数 (编辑框7.内容))
' Row111 = hal.取整数 (编辑框21.内容)
' Column111 = hal.取整数 (编辑框22.内容)
' Row222 = hal.取整数 (编辑框23.内容)
' Column222 = hal.取整数 (编辑框24.内容)
hal.赋值 (Line, hal.创建元组 (Row111, Column111, Row222, Column222))
hal.创建计量模型 (MetrologyHandle1)
hal.设置计量模型图像大小 (MetrologyHandle1, Image高, Image宽)
hal.添加计量对象通用 (MetrologyHandle1, “line”, Line, 20, 5, 1, 15, hal.创建元组 (), hal.创建元组 (), Index)
hal.设置颜色 (WindowHandle, “red”)
hal.应用计量模型 (Image2, MetrologyHandle1)
' *生成的轮廓
hal.取计量对象测量 (Contours1, MetrologyHandle1, “all”, “all”, Row3, Column3)
' *生成叉叉的记号
hal.创建十字XLD轮廓 (Cross1, Row3, Column3, 1, 0.785398)
hal.取计量对象结果 (MetrologyHandle1, “all”, “all”, “result_type”, “all_param”, Parameter)
' *生成中间的那条横线
hal.取计量对象模型轮廓 (Contour1, MetrologyHandle1, “all”, 1.5)
hal.清除计量模型 (MetrologyHandle1)
' *拟合直线
hal.创建多边形XLD轮廓 (Contour2, Row3, Column3)
hal.XLD轮廓拟合直线 (Contour2, “tukey”, -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
' hal.显示图像对象 (Contour2, 窗口ID)
' *算角度
hal.线位置 (RowBegin, ColBegin, RowEnd, ColEnd, RowCenter1, ColCenter1, Length1, Phi1)
' *算角度
hal.赋值 (radian1, Phi1)
hal.赋值 (degree1, hal. (hal. (radian1, 180), 3.1415926))
编辑框2303.内容 = 到文本 (degree1.取元组小数 ())
' 编辑框4.内容 = 到文本 (degree1.取元组小数 ())
' 编辑框9.内容 = 到文本 (到数值 (编辑框4.内容) - 到数值 (编辑框900.内容))
hal.XLD轮廓拟合直线 (Contour2, “tukey”, -1, 0, 5, 2, Row11, Column11, Row22, Column22, Nr1, Nc1, Dist1)
' hal.显示图像对象 (Contour2, 窗口ID)
' *特殊情况水平线
判断 (hal.等于 (hal. (Row22, Row11), 0))
hal.赋值 (k, 0)
hal.创建多边形XLD轮廓 (Contour1, hal.创建元组 (Row22, Row22), hal.创建元组 (0, Image高))
k = hal.取整数 ( (Column22.取元组小数 () - Column11.取元组小数 ()) ÷ (Row22.取元组小数 () - Row11.取元组小数 ()))
hal.赋值 (b, hal. (Column22, hal. (k, Row22)))
hal.赋值 (Row1, 0)
hal.赋值 (Row2, hal. (Image宽, 1))
hal.赋值 (col1, hal. (hal. (k, Row1), b))
hal.赋值 (col2, hal. (hal. (k, Row2), b))
hal.创建多边形XLD轮廓 (Contour1, hal.创建元组 (Row1, Row2), hal.创建元组 (col1, col2))

hal.显示图像对象 (Contour1, 窗口ID)
hal.求线段交点 (RowBegin1, ColBegin1, RowEnd1, ColEnd1, RowBegin, ColBegin, RowEnd, ColEnd, Row6, Column4, IsOverlapping)
hal.创建十字XLD轮廓 (Cross2, Row6, Column4, 200, 0.785398)
找到交点 = hal.显示图像对象 (Cross2, 窗口ID)
编辑框42.内容 = 到文本 (找到交点)
取交点原点Y = 到数值 (Row6.取元组小数 ())
取交点原点X = 到数值 (Column4.取元组小数 ())
编辑框2300.内容 = 到文本 (到数值 (Row6.取元组小数 ()) - 到数值 (编辑框800.内容))
编辑框2301.内容 = 到文本 (到数值 (Column4.取元组小数 ()) - 到数值 (编辑框801.内容))
编辑框2506.内容 = 编辑框2300.内容
编辑框2507.内容 = 编辑框2301.内容
hal.保存窗口到文件 (窗口ID, “png”, 取运行目录 ()“\测试完成图片\”到文本 (取现行时间 ()) + “_” + 编辑框10.内容 + “_左”)
如果 (编辑框2300.内容 ≠ “” 编辑框2301.内容 ≠ “”)
如果真 (按钮25.标题 = “标定开启”)
延时 (10)
线程_启动 (&标定A)

如果真 (到整数 (编辑框2302.内容) = 0 到整数 (编辑框2303.内容) = 0)
标签6.文本颜色 = #红色
标签6.标题 = “NG”
编辑框3.加入文本 (到文本 (取现行时间 ()) + “:左交点未生成,左计算NG”#换行符 )
编辑框20006.内容 = “2”


i支持库列表   支持库注释   
ehalcon_ch(未知支持库)



作者: 高庞    时间: 2024-6-7 22:47
附加软件界面

111.png (13 KB, 下载次数: 0)

111.png

11.png (35.18 KB, 下载次数: 0)

11.png

1111.png (25.69 KB, 下载次数: 0)

1111.png

1.png (315.21 KB, 下载次数: 0)

1.png

作者: 神一样的人猫腻    时间: 2024-6-7 23:56
感谢分享
作者: cs潇潇    时间: 2024-6-8 04:28
看不懂,这能校验打印机吗,感觉用途有限
作者: yysy3344    时间: 2024-6-8 10:49
niubiniubi666666
作者: 高庞    时间: 2024-6-8 17:42
神一样的人猫腻 发表于 2024-6-7 23:56
感谢分享

分享那方面的?抓图还是找线
作者: 高庞    时间: 2024-6-8 17:43
cs潇潇 发表于 2024-6-8 04:28
看不懂,这能校验打印机吗,感觉用途有限

主要是视觉定位这方面的
作者: 高庞    时间: 2024-6-8 17:44
yysy3344 发表于 2024-6-8 10:49
niubiniubi666666

谢谢老铁
作者: 高庞    时间: 2024-6-8 17:50
每天分享一点从创建窗口开始,分享
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
相机ID视觉元组  
相机ID1视觉元组  
窗口ID视觉元组  
窗口ID1视觉元组  
窗口ID2视觉元组  
窗口ID3视觉元组  
halHalcon19  
Image视觉对象  
Image高视觉元组  
Image宽视觉元组  
Image1视觉对象  
Image1高视觉元组  
Image1宽视觉元组  
绘制矩形视觉对象  
模板句柄视觉元组  
绘制矩形1视觉对象  
模板句柄1视觉元组  
模板轮廓视觉对象  
模板轮廓1视觉对象  
返回X视觉元组  
返回Y视觉元组  
返回角度视觉元组  
返回分数视觉元组  
中心Y双精度小数型  
中心X双精度小数型  
长半轴角度双精度小数型  
长半轴长度双精度小数型  
短半轴长度双精度小数型  
取原点X双精度小数型  
取原点Y双精度小数型  
取原点R视觉元组  
返回1X视觉元组  
返回1Y视觉元组  
返回角度1视觉元组  
返回分数1视觉元组  
中心1Y双精度小数型  
中心1X双精度小数型  
长半轴角度1双精度小数型  
长半轴长度1双精度小数型  
短半轴长度1双精度小数型  
取原点1X双精度小数型  
取原点1Y双精度小数型  
取原点1R视觉元组  
取交点原点X双精度小数型  
取交点原点Y双精度小数型  
取交点原点1X双精度小数型  
取交点原点1Y双精度小数型  
t整数型  
PLC接通逻辑型  
起点Y视觉元组  
起点X视觉元组  
终点Y视觉元组  
终点X视觉元组  
起点1Y视觉元组  
起点1X视觉元组  
终点1Y视觉元组  
终点1X视觉元组  
矩阵视觉元组  
临时矩阵视觉元组  
左边结果整数型  
右边结果整数型  
取图像原点Y文本型  
取图像原点X文本型  
启动软件整数型  
RB连接站点号整数型  
打开相机1短整数型  
打开相机2短整数型  
线程ID1整数型  
线程ID2整数型  
图像处理中整数型  

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
hal.打开窗口 (0, 0, 图片框1.宽度, 图片框1.高度, 图片框1.取窗口句柄 (), #视觉_窗口模式_可视, , 窗口ID)
hal.打开窗口 (0, 0, 图片框4.宽度, 图片框4.高度, 图片框4.取窗口句柄 (), #视觉_窗口模式_可视, , 窗口ID1)
hal.打开窗口 (0, 0, 图片框2.宽度, 图片框2.高度, 图片框2.取窗口句柄 (), #视觉_窗口模式_可视, , 窗口ID2)
hal.打开窗口 (0, 0, 图片框3.宽度, 图片框3.高度, 图片框3.取窗口句柄 (), #视觉_窗口模式_可视, , 窗口ID3)
hal.设置颜色 (窗口ID, #视觉_颜色_红色 )
hal.设置填充模式 (窗口ID, “margin”)
hal.设置线宽 (窗口ID, 3)
hal.设置颜色 (窗口ID1, #视觉_颜色_红色 )
hal.设置填充模式 (窗口ID1, “margin”)
hal.设置线宽 (窗口ID1, 3)
hal.设置颜色 (窗口ID2, #视觉_颜色_红色 )
hal.设置填充模式 (窗口ID2, “margin”)
hal.设置线宽 (窗口ID2, 3)
hal.设置颜色 (窗口ID3, #视觉_颜色_红色 )
hal.设置填充模式 (窗口ID3, “margin”)
hal.设置线宽 (窗口ID3, 3)


i支持库列表   支持库注释   
ehalcon_ch(未知支持库)


作者: year1970    时间: 2024-6-9 09:45
感谢分享
作者: hwq168    时间: 2024-6-13 19:35
有没有源码,和详细例子?
作者: 高庞    时间: 2024-6-14 21:13
hwq168 发表于 2024-6-13 19:35
有没有源码,和详细例子?

有的,从 设定模板,设定抓线,然后标定,旋转标定,一整套流程,都有。
作者: 高庞    时间: 2024-6-14 21:15
cs潇潇 发表于 2024-6-8 04:28
看不懂,这能校验打印机吗,感觉用途有限

肯定可以的,就是为了校正用的,你说的是,打印机打印条码出来,然后拍照定位,在贴合吧?
作者: cs潇潇    时间: 2024-6-14 21:36
高庞 发表于 2024-6-14 21:15
肯定可以的,就是为了校正用的,你说的是,打印机打印条码出来,然后拍照定位,在贴合吧? ...

不是,我指的是广告加工厂里的彩色喷墨打印机喷头校准
作者: 高庞    时间: 2024-6-15 09:53
cs潇潇 发表于 2024-6-14 21:36
不是,我指的是广告加工厂里的彩色喷墨打印机喷头校准

不懂你这个 校准是啥,能用图片示范一下?
作者: ddosdns    时间: 2024-6-21 14:44
halcon很强大
作者: 高庞    时间: 2024-6-21 20:01
ddosdns 发表于 2024-6-21 14:44
halcon很强大

图像处理比OPENCV快
作者: qq977352880    时间: 2024-8-6 02:30
收藏了,以后肯定用得到。

作者: qq977352880    时间: 2024-8-6 12:30
很庆幸看到了这个,非常感谢!

作者: 高庞    时间: 2024-8-7 15:35
寻找匹配模板---------------------------------
  
子程序名返回值类型公开备 注
左图像模板处理  
变量名类 型静态数组备 注
矩阵左视觉元组 
临时轮廓视觉对象 
临时矩形视觉对象 
角度转换双精度小数型 
ScaleR双精度小数型 
ScaleC双精度小数型 
如果真 (打开所有相机 = 10)
hal.复制图像 (相机1图片, Image)
图像预处理1 ()
' hal.设置模型参数 (模板句柄, “timeout”, 100)
左边结果 = hal.单模型寻找不同形状 (Image, 模板句柄, hal.角度到弧度 (0), hal.角度到弧度 (90), 1, 1, 1, 1, 到小数 (编辑框12.内容), 1, 0.5, “least_squares”, 到整数 (编辑框11.内容), 0.9, 返回Y, 返回X, 返回角度, , , 返回分数)
' 左边结果 = hal.寻找形状匹配模型 (Image, 模板句柄, 0, 360, 到小数 (编辑框12.内容), 1, 0.5, “least_squares”, 到整数 (编辑框11.内容), 0.9, 返回Y, 返回X, 返回角度, 返回分数)
' 左边结果 = hal.查找平面非校准可变形模型 (Image, 模板句柄, hal.角度到弧度 (0), hal.角度到弧度 (360), 1, 1, 1, 1, 到小数 (编辑框12.内容), 1, 1, 0, 0.9, , , 矩阵左, 返回分数)
如果 (hal.弧度到角度 (返回角度).取元组小数 () > 90)
角度转换 = hal.弧度到角度 (返回角度).取元组小数 () - 360
角度转换 = hal.弧度到角度 (返回角度).取元组小数 ()

如果真 (左边结果 = 0)
' hal.求点和角到刚性仿射变换 (0, 0, 0, 返回Y, 返回X, 返回角度, 矩阵左)
' hal.仿射变换XLD (模板轮廓, 临时轮廓, 矩阵左)
hal.创建矩形 (临时矩形, 返回Y, 返回X, 返回角度, 400, 400)
编辑框4.内容 = 到文本 (角度转换)
编辑框5.内容 = 到文本 (返回X.取元组小数 ())
编辑框6.内容 = 到文本 (返回Y.取元组小数 ())
编辑框7.内容 = 到文本 (到数值 (编辑框5.内容)到数值 (编辑框500.内容))
编辑框8.内容 = 到文本 (到数值 (编辑框6.内容)到数值 (编辑框600.内容))
编辑框902.内容 = 到文本 (到数值 (编辑框4.内容)到数值 (编辑框900.内容))
编辑框602.内容 = 编辑框8.内容
编辑框502.内容 = 编辑框7.内容
延时 (10)
如果真 (返回Y.取元组小数 () ≠ 0 返回X.取元组小数 () ≠ 0)
线程ID1 = 线程_启动 (&找交点)
临时矩形.显示 (窗口ID)
' Image.显示 (窗口ID)
' 左边结果 = 模板轮廓.显示 (窗口ID)

按钮4.标题 = “找模板关”
如果 (返回Y.取元组小数 () = 0 返回X.取元组小数 () = 0)
标签6.文本颜色 = #红色
标签6.标题 = “NG”
编辑框20006.内容 = “2”
_选择框1_被单击 ()





i支持库列表   支持库注释   
ehalcon_ch(未知支持库)


作者: 高庞    时间: 2024-8-7 15:43
qq977352880 发表于 2024-8-6 12:30
很庆幸看到了这个,非常感谢!

能用到就行
作者: 涤尘    时间: 2025-4-25 20:00
感谢分享’




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4