设置首页收藏本站
开启左侧

点胶后缺胶检测结果输出

[复制链接]
小妖怪旅店 发表于 2026-3-25 16:45:03 | 显示全部楼层 |阅读模式
悬赏20视觉币
在一个零件腔体四个角进行点胶,正常情况下,四个角的胶连续无缺少,异常情况下,会出现胶量缺失,如整个角缺胶,单个角胶量缺失一部分。需要把缺失的部分检测出来,并框起来,

最好可以量化缺失的胶量多少。

正常

正常

缺一角

缺一角

缺胶1

缺胶1

缺胶2

缺胶2
缺胶1.png
缺胶2.png
缺一角.png
完整.png

最佳答案

查看完整内容

仅供参考,主要思路就是图像对比,但你提供的图片中有一个最大的问题就是,即使都是正常的点胶,同一个位置点胶的区域也不是固定的,那比对的时候,这种导致的差异会造成很大的干扰,比如看下面三张图,第二张左下角的点胶区域就很其他的明显不同 read_image (Image, '1.png') get_image_size (Image, Width, Height) dev_get_window (WindowHandle) set_display_font (WindowHandle, 12, 'mono', 'true', 'false') *创建一个 ...
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
大凡光学,专注标定板提供
stone12138 发表于 2026-3-26 13:37:16 | 显示全部楼层
不知道为啥刚刚把代码粘过来显示不合法字符。。。。。。。
我是找到区域后的使用相对位置找精准区域,再阈值分割得到胶体区域,通过胶量的大小来卡,现场具体需要胶量多少不了解值可能还是要自己调整,然后也可以对总胶量进行限制。另外如果产品有旋转变化的话可以使用模板匹配来做。矩形框就是Rectangle。


1.PNG
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

 楼主| 小妖怪旅店 发表于 昨天 15:02 | 显示全部楼层
本帖最后由 小妖怪旅店 于 2026-4-2 15:03 编辑


参考了一部分,最后halcon用的是下面方法,使用相对位置截取ROI区域。能够检验出缺失情况,也能满足使用需要,当然这只是解决思路,具体需要重写应用到软件中去。

dev_close_window()
dev_update_off ()
read_image (Image, 'E:/Halcon/Project/点胶封盖机/缺胶/无胶.bmp')
dev_open_window_fit_image (Image, 0, 0, 800, -1, WindowHandle)
dev_display (Image)

* 绘制外多边形
dev_disp_text ('绘制外目标区域', 'window', 'top', 'left', 'red', 'box', 'false')
draw_region (OuterRegion, WindowHandle)
dev_display (Image)   
* 绘制内多边形
dev_disp_text ('绘制内目标区域', 'window', 'top', 'left', 'red', 'box', 'false')
draw_region (InnerRegion, WindowHandle)
   
* 计算差值区域
difference (OuterRegion, InnerRegion, RegionDifference)
dev_display (RegionDifference)   

* 绘制中心

dev_display (Image)  
dev_disp_text ('绘制内中心矩形', 'window', 'top', 'left', 'red', 'box', 'false')
draw_rectangle2 (WindowHandle, Row_sour, Column_sour, Phi_sour, Length1, Length2)

read_image (ImageTar, 'E:/Halcon/Project/点胶封盖机/缺胶/正常2.bmp')
dev_display (ImageTar)  
dev_disp_text ('绘制内中心矩形', 'window', 'top', 'left', 'red', 'box', 'false')
draw_rectangle2 (WindowHandle, Row_tar, Column_tar, Phi_tar, Length1, Length2)

vector_angle_to_rigid (Row_sour,Column_sour , Phi_sour,\
Row_tar ,Column_tar ,Phi_tar , HomMat2D)

affine_trans_region (RegionDifference, RegionAffineTrans, HomMat2D, 'nearest_neighbor')

* 提取图像
reduce_domain (ImageTar, RegionAffineTrans, ImageReduced)

* 显示结果
dev_open_window_fit_image (ImageTar, 0, 0, -1, 400, WindowHandle2)
dev_display (ImageReduced)

mean_image (ImageReduced, ImageMean, 9, 9)
threshold (ImageMean, Regions, 11, 130)
opening_circle (Regions, RegionOpening, 5.5)
closing_circle (RegionOpening, RegionClosing, 20.5)
fill_up (RegionClosing, RegionFillUp)
connection (RegionFillUp, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
dev_display (SelectedRegions)

识别.png
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

halcon2016 发表于 2026-3-25 16:45:04 | 显示全部楼层

仅供参考,主要思路就是图像对比,但你提供的图片中有一个最大的问题就是,即使都是正常的点胶,同一个位置点胶的区域也不是固定的,那比对的时候,这种导致的差异会造成很大的干扰,比如看下面三张图,第二张左下角的点胶区域就很其他的明显不同
1.png 2.png 3.png


read_image (Image, '1.png')
get_image_size (Image, Width, Height)
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 12, 'mono', 'true', 'false')

*创建一个模板用于对齐图像
gen_rectangle1 (ROI_0, 88.7986, 511.103, 145.144, 664.311)
reduce_domain (Image, ROI_0, ImageReduced)
create_generic_shape_model (ShapeModelID)
train_generic_shape_model (ImageReduced, ShapeModelID)
set_generic_shape_model_param (ShapeModelID, 'angle_start', rad(-10))
set_generic_shape_model_param (ShapeModelID, 'angle_end', rad(10))
area_center (ROI_0, Area, ModelRow, ModelColumn)


*定义检测范围,用多边形工具绘制
gen_region_runs (ROI_1, [16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112], [497,478,477,476,475,474,474,473,472,472,471,471,470,470,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,470,470,470,470,471,471,472,472,473,473,474,474,475,475,476,476,476,476,476,477,477,477,477,477,477,478,478,478,478], [514,515,516,516,516,515,515,516,516,516,517,517,517,515,506,502,498,494,491,490,489,487,486,486,485,485,484,484,484,484,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,485,485,485,485,486,486,486,486,487,487,487,488,488,488,489,489,490,490,490,490,490,490,490,490,490,490,489,489,488,488,488,487,485,484,482,481,479])
gen_region_runs (TMP_Region, [16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98], [586,583,582,582,581,581,581,581,581,581,581,581,580,605,654,682,687,690,691,691,691,691,691,691,691,692,692,692,692,692,692,692,692,692,692,692,692,692,692,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,694,694,694,694,694,694,694,694,694,694,694,694,694,694,695,695,695,695,695,695,695,695,695,696,696,698,701,703,706], [644,701,702,703,704,704,705,706,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707])
union2 (ROI_1, TMP_Region, ROI_1)
gen_region_runs (TMP_Region, [323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,393,394,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415], [478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,479,479,479,564,479,528,479,479,479,479,479,479,479,479,480,480,480,480,480,480,481,482,483,485,486,487,499], [478,491,491,492,492,492,492,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,494,494,495,495,495,496,496,498,500,502,504,506,581,508,583,585,586,587,587,588,589,589,590,590,590,590,590,590,589,587,585,583,582,582,581,581])
union2 (ROI_1, TMP_Region, ROI_1)
gen_region_runs (TMP_Region, [191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325], [695,695,695,695,695,695,695,694,694,694,694,694,694,693,692,691,691,690,689,688,687,686,686,685,684,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,682,682,681,681,680,679,679,678,678,677,676,676,675,675,674,673,673,672,672,671,670,670,669,669,668,667,667,666,666,665,664,664,663,663,662,663,664,664,665,666,667,668,668,669,670,671,671,672,673,674,675,675,676,677], [708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,708,708,707,706,706,705,704,703,703,702,701,701,700,699,699,698,697,696,696,695,694,694,693,692,692,691,690,690,689,688,687,687,686,685,685,684,683,683,682,681,680,680,679,678,678,677])
union2 (ROI_1, TMP_Region, ROI_1)


gen_image_const (VarImage, 'byte', Width, Height)
create_variation_model (Width, Height, 'byte', 'direct', VarModelID)
prepare_direct_variation_model (Image, VarImage, VarModelID, 65, 4)

for i := 2 to 4 by 1
    read_image (Image1, i+'.png')
    find_generic_shape_model (Image1, ShapeModelID, MatchResultID, NumMatchResult)
    if (NumMatchResult != 0)
        get_generic_shape_model_result (MatchResultID, 'best', 'row', Row)
        get_generic_shape_model_result (MatchResultID, 'best', 'column', Column)
        get_generic_shape_model_result (MatchResultID, 'best', 'angle', Angle)
        vector_angle_to_rigid (Row, Column, Angle, ModelRow, ModelColumn, 0, HomMat2D)
        affine_trans_image (Image1, ImageAffineTrans, HomMat2D, 'constant', 'false')
        reduce_domain (ImageAffineTrans, ROI_1, ImageReduced1)
        compare_ext_variation_model (ImageReduced1, RegionDiff, VarModelID, 'absolute')
        connection (RegionDiff, ConnectedRegions)
        select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
        dev_clear_window ()
        dev_display (ImageAffineTrans)
        dev_display (SelectedRegions)
    endif
    stop ()
endfor

clear_shape_model (ShapeModelID)
clear_variation_model (VarModelID)

奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

18861175562 发表于 2026-3-25 20:24:35 | 显示全部楼层
ai可以初略检测 不好做量化
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

stone12138 发表于 2026-3-26 10:28:26 | 显示全部楼层
为啥四个角的正常胶量在不同图片不一样啊,原本想用面积卡的,那这样的话缺胶其实是点胶后被抹除吗
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

 楼主| 小妖怪旅店 发表于 2026-3-26 11:20:43 | 显示全部楼层
stone12138 发表于 2026-3-26 10:28
为啥四个角的正常胶量在不同图片不一样啊,原本想用面积卡的,那这样的话缺胶其实是点胶后被抹除吗 ...

四张是不同的图像,缺胶现象很少,手动擦除了几个位置,模拟缺陷。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

 楼主| 小妖怪旅店 发表于 2026-3-26 11:27:39 | 显示全部楼层
四个角都需要一定量的胶,能检查出不能缺失太多就行。
完整.png
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

 楼主| 小妖怪旅店 发表于 2026-3-26 11:33:54 | 显示全部楼层
我这边是手动截取目标区域,再检查出来,有没有其他更好的方法。


dev_close_window()
dev_update_off ()
read_image (Image, 'E:/Halcon/Project/点胶封盖机/缺胶/正常.bmp')
dev_open_window_fit_image (Image, 0, 0, 800, -1, WindowHandle)
dev_display (Image)

* 绘制外多边形
dev_disp_text ('绘制外目标区域', 'window', 'top', 'left', 'red', 'box', 'false')
draw_region (OuterRegion, WindowHandle)
dev_display (Image)   
* 绘制内多边形
dev_disp_text ('绘制内目标区域', 'window', 'top', 'left', 'red', 'box', 'false')
draw_region (InnerRegion, WindowHandle)
   
* 计算差值区域
difference (OuterRegion, InnerRegion, RegionDifference)
dev_display (RegionDifference)   

* 提取图像
reduce_domain (Image, RegionDifference, ImageReduced)

* 显示结果
dev_open_window (0, 850, 400, 400, 'black', WindowHandle2)
dev_display (ImageReduced)

mean_image (ImageReduced, ImageMean, 9, 9)

threshold (ImageMean, Regions, 11, 83)

opening_circle (Regions, RegionOpening, 5.5)

closing_circle (RegionOpening, RegionClosing, 20.5)

fill_up (RegionClosing, RegionFillUp)
connection (RegionFillUp, ConnectedRegions)

显示.png
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表