胶水路径应用

  • 1. 项目要求
  • 2. 算法分析
  • 3. 效果展示
  • 4. halcon代码
  • 5. 资源下载

1. 项目要求

  • 如下图,点胶机想在红色箭头路径上点胶,电池使用背光源定位。
  • 要求:操作简单(尝试不使用模板),可以设置胶水路径的偏移量。

2. 算法分析

  • 第一种方法想到的是使用模板匹配找到电池位置,然后检测直线的区域使用仿射变换跟随模板移动,找到四条边,求出四个交点。胶水路径也是直线,可以使用边缘直线偏移得到。
  • 第二种方法第一种不同的是,不再使用模板匹配进行粗定位,而是使用Blob分析直接确定抓取直线的大致区域,然后抓直线求交点,后面做法相同。
  • 这里我采用了第二种方法,代码比较多,但是写成软件后,操作起来步骤会少。

3. 效果展示

  • 由于暂时没能拿到原图,所以自己用画图软件花了几张图来测试。

原图

找到电池主体

找到放置抓边工具的位置

抓边

计算胶水路径

带有角度1

带有角度2

4. halcon代码

list_files ('', ['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 1read_image (Image, ImageFiles[Index])rgb1_to_gray (Image, GrayImage)dev_set_line_width (2)* 1. 分割电池主体部分GetCellBody (GrayImage, Rectangle)dev_display (GrayImage)dev_display (Rectangle)stop()* 2. 计算角点 左上角点作为起点,逆时针排列GetCornerPoints (GrayImage, Rectangle, CornerRow, CornerCol)gen_cross_contour_xld (Cross, CornerRow, CornerCol, 150, 0)dev_display (GrayImage)dev_display (Cross)stop()* 3. 边缘测量 求交点Elements:=20DetectHeight:=150DetectWidth:=5Sigma:=3Threshold:=30Transition:='all'Select:='all'ActiveNum:=5GetIntersetcionPoints (GrayImage, Line1, Line2, Line3, Line4, \Elements, DetectHeight, DetectWidth, Sigma, Threshold, Transition, Select,\CornerRow, CornerCol, ActiveNum, Row1, Column1, Row2, Column2, Row3, Column3, Row4, Column4)dev_display (GrayImage)dev_set_color ('green')dev_display (Line1)dev_display (Line2)dev_display (Line3)dev_display (Line4)stop()* 4. 将边缘线沿着垂线方向向电芯内侧平移TranslationX:=150  //控制点胶线径向方向的移动距离Avoid1:=100        //控制点胶线切向方向的移动距离1Avoid2:=300        //控制点胶线切向方向的移动距离2GetGluePoints (Line1, Line2, Glue1, Glue2, TranslationX, Avoid1, Avoid2, Row1, Column1, Row2, Column2, Row3, Column3, Row4, Column4, RowNew1, ColumnNew1, RowNew2, ColumnNew2, RowNew3, ColumnNew3, RowNew4, ColumnNew4)dev_display (GrayImage)dev_set_color ('red')dev_display (Glue1)dev_set_color ('green')dev_display (Glue2)stop()
endfor
  • GetCellBody
threshold (GrayImage, Regions1, 0, 83)
connection (Regions1, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2.74491e+006, 5e+006)
opening_rectangle1 (SelectedRegions, RegionOpening, 400, 400)
smallest_rectangle2 (RegionOpening, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
return ()
  • GetCornerPoints
get_image_size (GrayImage, Width, Height)
gen_image_const (Image1, 'byte', Width, Height)
paint_region (Image1, Image1, ImageResult, 255, 'fill')
paint_region (Rectangle, ImageResult, ImageResult, 0, 'fill')
points_foerstner (ImageResult, 1, 2, 3, 200, 0.1, 'gauss', 'false', \RowJunctions, ColumnJunctions, CoRRJunctions, CoRCJunctions,\CoCCJunctions, RowArea, ColumnArea, CoRRArea, CoRCArea, CoCCArea)* 角点排序 检测角点是从上向下逐行检测的 排序是从左上角点开始,从左到右,从上到下
CornerRow:=[]
CornerCol:=[]
if (ColumnJunctions[0]<ColumnJunctions[1])CornerRow[0]:=RowJunctions[0]CornerCol[0]:=ColumnJunctions[0]CornerRow[1]:=RowJunctions[1]CornerCol[1]:=ColumnJunctions[1]
elseCornerRow[0]:=RowJunctions[1]CornerCol[0]:=ColumnJunctions[1]CornerRow[1]:=RowJunctions[0]CornerCol[1]:=ColumnJunctions[0]
endifif (ColumnJunctions[2]<ColumnJunctions[3])CornerRow[2]:=RowJunctions[2]CornerCol[2]:=ColumnJunctions[2]CornerRow[3]:=RowJunctions[3]CornerCol[3]:=ColumnJunctions[3]
elseCornerRow[2]:=RowJunctions[3]CornerCol[2]:=ColumnJunctions[3]CornerRow[3]:=RowJunctions[2]CornerCol[3]:=ColumnJunctions[2]
endif
return ()
  • GetIntersetcionPoints
rake (GrayImage, Regions, Elements, DetectHeight, DetectWidth, Sigma, Threshold, Transition, Select, CornerRow[0], CornerCol[0], CornerRow[1], CornerCol[1], ResultRow, ResultColumn)
pts_to_best_line (Line1, ResultRow, ResultColumn, ActiveNum, Row01, Column01, Row10, Column10)rake (GrayImage, Regions, Elements, DetectHeight, DetectWidth, Sigma, Threshold, Transition, Select, CornerRow[2], CornerCol[2], CornerRow[3], CornerCol[3], ResultRow, ResultColumn)
pts_to_best_line (Line2, ResultRow, ResultColumn, ActiveNum, Row23, Column23, Row32, Column32)rake (GrayImage, Regions, Elements, DetectHeight, DetectWidth, Sigma, Threshold, Transition, Select, CornerRow[0], CornerCol[0], CornerRow[2], CornerCol[2], ResultRow, ResultColumn)
pts_to_best_line (Line3, ResultRow, ResultColumn, ActiveNum, Row02, Column02, Row20, Column20)rake (GrayImage, Regions, Elements, DetectHeight, DetectWidth, Sigma, Threshold, Transition, Select, CornerRow[1], CornerCol[1], CornerRow[3], CornerCol[3], ResultRow, ResultColumn)
pts_to_best_line (Line4, ResultRow, ResultColumn, ActiveNum, Row13, Column13, Row31, Column31)intersection_lines (Row01, Column01, Row10, Column10, Row02, Column02, Row20, Column20, Row1, Column1, IsOverlapping)
intersection_lines (Row01, Column01, Row10, Column10, Row13, Column13, Row31, Column31, Row2, Column2, IsOverlapping)
intersection_lines (Row23, Column23, Row32, Column32, Row02, Column02, Row20, Column20, Row3, Column3, IsOverlapping)
intersection_lines (Row23, Column23, Row32, Column32, Row13, Column13, Row31, Column31, Row4, Column4, IsOverlapping)gen_cross_contour_xld (Cross1, Row1, Column1, 96, 0)
gen_cross_contour_xld (Cross2, Row2, Column2, 96, 0)
gen_cross_contour_xld (Cross3, Row3, Column3, 96, 0)
gen_cross_contour_xld (Cross4, Row4, Column4, 96, 0)
return ()
  • GetGluePoints
* 计算边缘线Line1的角度Phi1
gen_region_contour_xld (Line1, Region, 'filled')
orientation_region (Region, Phi1)if (Phi1>rad(90))Phi1:=Phi1-rad(180)
endif* Cross1平移
RowNew1:=Row1+TranslationX*cos(Phi1)
ColumnNew1:=Column1+TranslationX*sin(Phi1)
RowNew1:=RowNew1-Avoid1*sin(Phi1)
ColumnNew1:=ColumnNew1+Avoid1*cos(Phi1)
gen_cross_contour_xld (CrossNew1, RowNew1, ColumnNew1, 96, 0)
dev_display (CrossNew1)* Cross2平移
RowNew2:=Row2+TranslationX*cos(Phi1)
ColumnNew2:=Column2+TranslationX*sin(Phi1)
RowNew2:=RowNew2+Avoid2*sin(Phi1)
ColumnNew2:=ColumnNew2-Avoid2*cos(Phi1)
gen_cross_contour_xld (CrossNew2, RowNew2, ColumnNew2, 96, 0)
dev_display (CrossNew2)* 计算边缘线Line2的角度Phi2
gen_region_contour_xld (Line2, Region, 'filled')
orientation_region (Region, Phi2)* Cross3平移
RowNew3:=Row3-TranslationX*cos(Phi1)
ColumnNew3:=Column3-TranslationX*sin(Phi1)
RowNew3:=RowNew3-Avoid1*sin(Phi1)
ColumnNew3:=ColumnNew3+Avoid1*cos(Phi1)
gen_cross_contour_xld (CrossNew3, RowNew3, ColumnNew3, 96, 0)
dev_display (CrossNew3)* Cross4平移
RowNew4:=Row4-TranslationX*cos(Phi1)
ColumnNew4:=Column4-TranslationX*sin(Phi1)
RowNew4:=RowNew4+Avoid2*sin(Phi1)
ColumnNew4:=ColumnNew4-Avoid2*cos(Phi1)
gen_cross_contour_xld (CrossNew4, RowNew4, ColumnNew4, 96, 0)
dev_display (CrossNew4)* 连接点胶线
gen_contour_polygon_xld (Glue1, [RowNew1,RowNew2], [ColumnNew1,ColumnNew2])
gen_contour_polygon_xld (Glue2, [RowNew3,RowNew4], [ColumnNew3,ColumnNew4])
return ()

5. 资源下载

https://download.csdn.net/download/weixin_38566632/37707775

Halcon——点胶机胶水路径应用(1)相关推荐

  1. Halcon——点胶机胶水路径应用(2)

    点胶机胶水路径应用 1. 寻找一种更简单的方法 2. 处理效果 3. Halcon代码 4.资源下载 接续上一篇Halcon--点胶机胶水路径应用(1): https://blog.csdn.net/ ...

  2. Halcon默认例程与默认图片路径

    我使用的版本HDevelop 20.05 Progress (64-bit) - MVTec HALCON 我的Halcon安装路径:D:\ProgramFiles\Halcon20 Halcon默认 ...

  3. 2021-02-04 Halcon初学者知识【12】 如何配置VC++和Halcon环境

    前言 配置在VC++上配置Halcon是个非常简单的过程:但是恰恰许多人对VC++项目配置很是头痛,至使拖延了学习进度.本篇将简单告诉你如何做的有条理,使这种配置不再是难事. 1 检查系统,做到心中有 ...

  4. HALCON示例程序bottle.hdev、bottlet.hdev瓶体字符OCR的训练和检测

    HALCON示例程序bottle.hdev.bottlet.hdev瓶体字符OCR的训练和检测 示例程序源码(加注释) 1.先介绍bottlet.hdev(训练OCR识别文件) *定义一个字符串变量F ...

  5. HALCON帮助文件丢失

    问题:halcon帮助文件丢失,通常由于文件目录改变,导致halcon找不到帮助文件,因此将帮助文件的地址更改即可. 方法一:将halcon所在的文件名更改为原始文件名(最开始安装halcon时的路径 ...

  6. HALCON示例程序classify_halogen_bulbs.hdev使用SVM分类器检测卤素灯泡的好坏

    HALCON示例程序classify_halogen_bulbs.hdev使用SVM分类器检测卤素灯泡的好坏 示例程序源码(加注释) 得到halcon默认图片存储路径 get_system ('ima ...

  7. (转)Qt+Halcon联合开发配置

    转自:Y忍冬草        Y忍冬草_ http://blog.csdn.net/y363703390    https://blog.csdn.net/y363703390/article/det ...

  8. VS+Qt应用开发-Qt+Halcon显示图片,实现鼠标缩放、移动图片

    VS+Qt应用开发-Qt+Halcon显示图片,实现鼠标缩放.移动图片 效果展示 界面设计 代码例程 完整代码 CMyLabel.h CMyLabel.cpp BrowsePic.h BrowsePi ...

  9. 【Halcon】Qt+Halcon联合开发配置

    自我约束,自我管理 不幸的人或有不同,但幸运的人大都有更好的自我约束.自我管理! 1. 凡事提前一点 2. 做事前梳理,做事后整理 3. 多些正能量,少些抱怨 4.多发现别人优点,并真诚的赞美 5.坚 ...

最新文章

  1. linux 变量替换字符串,变量替换 字符串处理
  2. 雪花算法 Java 版
  3. 字节跳动端到端深度学习召回算法
  4. 工业富联2018年报来了!上市后首张成绩单大起底
  5. 从构建分布式秒杀系统聊聊线程池
  6. idl结果显示窗口如何缩小_科学网—IDL 创建窗口 - 钱磊的博文
  7. 012_logback中的DBAppender
  8. 围成一圈的排列组合问题_约瑟夫问题
  9. 循序渐进DB2.DBA系统管理、运维与应用案例pdf
  10. 使用Python的twisted和socket模块实现端口的负载分发
  11. 令人绝望的第五周作业
  12. C# 海康DVR客户端开发系列(2)—— 封装API (1)
  13. 遗传算法多维matlab,MATLAB遗传算法
  14. pythongui入门实例大全详细教程全_python简单进阶之GUI:PySimpleGUI案例
  15. devops运维平台汇总
  16. 谷歌play下载无法安装_否,您无法从Google Play下载32GB SD卡
  17. UEFI 及 legacy 重装系统
  18. 计算机以太网,局域网,互联网,令牌网,ATM网络
  19. 示波器的各种文件存储方式与分析
  20. 【生活记录】瑞泽家园学区调研

热门文章

  1. 【记录】JS回调函数(小例子)
  2. Web Service Compression for .NET CF 3.5
  3. hbase小版本升级
  4. 计算机网络原理填空题
  5. ssh: connect to host 192.168.121.128 port 22: No route to host
  6. 使用命令行 启动 各种服务(控制面板 开机启动项 注册表 等)
  7. 【Shell】检查字符串大小
  8. MySQL在并发场景下的问题及解决思路
  9. 中心/设置地图缩放以覆盖所有可见的标记?
  10. Shell命令对整数求和,每行一个?