目标:在一组图片中找到每张图片中四边形的角点,其中这三张图片是不同的相机拍摄的,大小可能存在差异。
原图
效果图
放大细节
代码
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.显示效果。
大概就是这样一个过程,这些点的对应关系注意不要混淆,不然会混乱。