机器视觉halcon学习——四边形找角点

目标:在一组图片中找到每张图片中四边形的角点,其中这三张图片是不同的相机拍摄的,大小可能存在差异。

原图
请添加图片描述

请添加图片描述
请添加图片描述
效果图
在这里插入图片描述
放大细节
在这里插入图片描述
代码

read_image(Image,'D:/1207_培训/培训计划/halcon培训测试题/卡尺工具/练习题/求四个角点/computar.bmp')
dev_get_window(WindowHandle)
dev_set_color('red')
get_image_size(Image, Width, Height)
*处理图片
threshold (Image, Regions, 30, 240)
connection(Regions, ConnectedRegions) 
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 0, 1470000)
union1(SelectedRegions, RegionUnion)
color := [255,0,0]
overpaint_region (Image, RegionUnion, color, 'fill')
stop()
*制作模板
draw_rectangle1(WindowHandle, Row12, Column12, Row22, Column22)
gen_rectangle1(Rectangle, Row12, Column12, Row22, Column22)
area_center(Rectangle, Area, Row3, Column3)
reduce_domain(Image, Rectangle, ImageReduced)
create_scaled_shape_model(ImageReduced, 'auto', -0.39, rad(360), rad(0.1299), 0.54, 46.41, 'auto', 'auto', 'ignore_global_polarity', 'auto', 'auto', ModelID)
*create_shape_model(ImageReduced, 'auto',rad(30), rad(90), 'auto', 'auto', 'ignore_local_polarity', 'auto', 'auto', ModelID)
stop()
*画四根线
draw_rake(Regions, WindowHandle, 30, 60, 15, Row1, Column1, Row2, Column2)
draw_rake(Regions1, WindowHandle, 30, 60, 15, Row11, Column11, Row21, Column21)
draw_rake(Regions4, WindowHandle, 30, 60, 15, Row15, Column15, Row25, Column25)
draw_rake(Regions5, WindowHandle, 30, 60, 15, Row16, Column16, Row26, Column26)
*显示四根线
rake(Image, Regions2, 30, 60, 15, 1, 20, 'positive', 'max',  Row1, Column1, Row2, Column2, ResultRow, ResultColumn)
gen_cross_contour_xld(Cross, ResultRow, ResultColumn, 6, 0.785398)
pts_to_best_line(Line, ResultRow, ResultColumn, 2, Row13, Column13, Row23, Column23)
stop()
rake(Image, Regions3, 30, 60, 15, 1, 20, 'all', 'max', Row11, Column11, Row21, Column21, ResultRow1, ResultColumn1)
gen_cross_contour_xld(Cross1, ResultRow1, ResultColumn1, 6, 0.785398)
pts_to_best_line(Line1, ResultRow1, ResultColumn1, 2, Row14, Column14, Row24, Column24)
stop()
rake(Image, Regions6, 30, 60, 15, 1, 20, 'all', 'max', Row15, Column15, Row25, Column25, ResultRow3, ResultColumn3)
gen_cross_contour_xld(Cross2, ResultRow3, ResultColumn3, 6, 0.785398)
pts_to_best_line(Line2, ResultRow3, ResultColumn3, 2, Row17, Column17, Row27, Column27)
stop()
rake(Image, Regions7, 30, 60, 15, 1, 20, 'all', 'max', Row16, Column16, Row26, Column26, ResultRow4, ResultColumn4)
gen_cross_contour_xld(Cross3,  ResultRow4, ResultColumn4, 6, 0.785398)
pts_to_best_line(Line3, ResultRow4, ResultColumn4, 2, Row18, Column18, Row28, Column28)
stop()
*开始循环图片
list_files ('D:/1207_培训/培训计划/halcon培训测试题/卡尺工具/练习题/求四个角点', ['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 1
    read_image (Image, ImageFiles[Index])
    threshold (Image, Regions, 30, 240)
    connection(Regions, ConnectedRegions)
    select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 0, 1470000)
    union1(SelectedRegions, RegionUnion)
    color := [255,0,0]
    overpaint_region (Image, RegionUnion, color, 'fill')
    *查找模板
    find_scaled_shape_model(Image, ModelID,rad(0), rad(360), 0.54, 46.41, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Scale, Score)
    if(|Row|>0)
        dev_display_shape_matching_results(ModelID, 'red', Row, Column, Angle, 1, 1, 0)
        stop()
        dev_set_color('blue')
        *仿射第一条直线
        vector_angle_to_rigid(Row3, Column3, 0, Row, Column, Angle, HomMat2D)
        affine_trans_pixel(HomMat2D, Row1, Column1, RowTrans11, ColTrans11)
        affine_trans_pixel(HomMat2D, Row2, Column2, RowTrans12, ColTrans12)
        rake(Image, Regions2, 30, 90, 15, 1, 20, 'positive', 'max', RowTrans11, ColTrans11,RowTrans12, ColTrans12, ResultRow11, ResultColumn11)
        gen_cross_contour_xld(Cross4, ResultRow11, ResultColumn11, 6, Angle)
        pts_to_best_line(Line4, ResultRow11, ResultColumn11, 2, Row19, Column19, Row29, Column29)
        stop()
 
        *仿射第二条直线
        affine_trans_pixel(HomMat2D, Row11, Column11, RowTrans21, ColTrans21)
        affine_trans_pixel(HomMat2D, Row21, Column21, RowTrans22, ColTrans22)
        rake(Image, Regions3, 30, 90, 15, 1, 20, 'all', 'max', RowTrans21, ColTrans21, RowTrans22, ColTrans22, ResultRow22, ResultColumn22)
        gen_cross_contour_xld(Cross5,ResultRow22, ResultColumn22, 6, Angle)
        pts_to_best_line(Line5, ResultRow22, ResultColumn22, 2, Row110, Column110, Row210, Column210)
        stop()
  
        *求第一个角点
        tuple_length (Row19, Length)
        tuple_length (Row110, Length1)
        if (Length==1 and Length1==1)
        *两线段交点
        intersection_lines (Row19, Column19, Row29, Column29,Row110, Column110, Row210, Column210,Row4, Column4, IsOverlapping) 
        gen_cross_contour_xld(Cross4, Row4, Column4, 40, 0.785398)
        endif
        stop()
        *第三个线
        affine_trans_pixel(HomMat2D, Row15, Column15, RowTrans31, ColTrans31)
        affine_trans_pixel(HomMat2D, Row25, Column25, RowTrans32, ColTrans32)
        rake(Image, Regions6, 30, 90, 15, 1, 20, 'all', 'max', RowTrans31, ColTrans31, RowTrans32, ColTrans32, ResultRow55, ResultColumn55)
        gen_cross_contour_xld(Cross6, ResultRow55, ResultColumn55, 6, Angle)
        pts_to_best_line(Line6,ResultRow55, ResultColumn55, 2, Row111, Column111, Row211, Column211)
        stop()
        *求第二个角点
        tuple_length (Row110, Length)
        tuple_length (Row111, Length1)
        if (Length==1 and Length1==1)
            *两线段交点
            intersection_lines (Row110, Column110, Row210, Column210,Row111, Column111, Row211, Column211,Row5, Column5, IsOverlapping) 
            gen_cross_contour_xld(Cross5, Row5, Column5, 40, 0.785398)
        endif
        stop()
        affine_trans_pixel(HomMat2D, Row16, Column16, RowTrans41, ColTrans41)
        affine_trans_pixel(HomMat2D, Row26, Column26, RowTrans42, ColTrans42)
        rake(Image, Regions7, 30, 90, 15, 1, 20, 'all', 'max', RowTrans41, ColTrans41, RowTrans42, ColTrans42, ResultRow66, ResultColumn66)
        gen_cross_contour_xld(Cross7, ResultRow66, ResultColumn66, 6, Angle)
        pts_to_best_line(Line7, ResultRow66, ResultColumn66, 2, Row112, Column112, Row212, Column212)
        stop()
        
        *求第三个角点
        tuple_length (Row111, Length)
        tuple_length (Row112, Length1)
        if (Length==1 and Length1==1)
            *两线段交点
            intersection_lines (Row111, Column111, Row211, Column211,Row112, Column112, Row212, Column212,Row6, Column6, IsOverlapping) 
            gen_cross_contour_xld(Cross6, Row6, Column6, 40, 0.785398)
        endif
        stop()
        dev_display(Line4)
        dev_display(Line7)
        *求第四个角点
        tuple_length (Row112, Length)
        tuple_length (Row19, Length1)
        if (Length==1 and Length1==1)
            *两线段交点
            intersection_lines (Row112, Column112, Row212, Column212,Row19, Column19, Row29, Column29,Row7, Column7, IsOverlapping) 
            gen_cross_contour_xld(Cross7, Row7, Column7, 40, 0.785398)
        endif
        stop()
        dev_display(Image)
        dev_display(Line4)
        dev_display(Line5)
        dev_display(Line6)
        dev_display(Line7)
        stop()
        dev_set_color('red')
        dev_display(Cross4)
        dev_display(Cross5)
        dev_display(Cross6)
        dev_display(Cross7)
        stop()
        dev_set_color('slate blue')
        dev_display(Cross4)
        disp_message (200000, ['第一个角点坐标','x:'+Row4,'y:'+Column4], 'window', 50, 50, 'black', 'true')
        dev_display(Cross5)
        disp_message (200000, ['第2个角点坐标','x:'+Row7,'y:'+Column7], 'window', 100, 50, 'black', 'true')
        dev_display(Cross6)
        disp_message (200000, ['第3个角点坐标','x:'+Row5,'y:'+Column5], 'window', 150, 50, 'black', 'true')
        dev_display(Cross7)
        disp_message (200000, ['第4个角点坐标','x:'+Row6,'y:'+Column6], 'window', 200, 50, 'black', 'true')
stop()
    endif
endfor

由于这三张图片中间那个东西大小可能不一样,所以找模板的时候,要注意缩放的范围,调大一点。

这个跟上一个用到的方法是很类似的。简单总结一下:
1.创建模板。都裁一块区域用来创建模板,并且获取他的中心位置,以便后面形成矩阵。
2.都引入外部算子,draw_rake. 这个算子可以在图像上面任意画线,并且最后返回你所画的线的始末位置坐标。rake. 这个算子用一些小矩形根据你的始末位置坐标把你画的线框出来,每一个框都对应一个坐标点。可以用gen_cross_contour_xld来显示这些坐标点。
3.开始查找模板。
4.开始仿射变换。这个用来形成矩阵,vector_angle_to_rigid,前面三个参数是绕着的点,这里是模板中心点,后面三个参数是找到的模板里面的点。这里都是点对应仿射,用affine_trans_pixel,前面两个坐标是原始坐标,后面两个是仿射后的坐标。
5.显示效果。

大概就是这样一个过程,这些点的对应关系注意不要混淆,不然会混乱。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值