【Halcon 计算两直线的真实距离 投影变换】

Halcon 计算两直线的真实距离

// An highlighted block

**输入的直线1Contour
gen_region_contour_xld (LineContour1, Region1, 'filled')
**获取直线1的点
get_region_points (Region1, Rows1, Columns1)
**直线1的点转换到世界坐标系
image_points_to_world_plane (CameraParam, CameraPose, Rows1, Columns1, 'mm', Points_Y1, Points_X1)
**直线1的起点与终点
Line1_Y[0]:=[Points_Y1[0]]
Line1_X[0]:=[Points_X1[0]]
Line1_Y[1]:=[Points_Y1[|Points_Y1|-1]]
Line1_X[1]:=[Points_X1[|Points_X1|-1]]

*输入的直线2Contour
gen_region_contour_xld (LineContour2, Region2, 'filled')
**获取直线2的点
get_region_points (Region2, Rows2, Columns2)
**直线2的点转换到世界坐标系
image_points_to_world_plane (CameraParam, CameraPose, Rows2, Columns2, 'mm', Points_Y2, Points_X2)
**直线2的起点与终点
Line2_Y[0]:=[Points_Y2[0]]
Line2_X[0]:=[Points_X2[0]]
Line2_Y[1]:=[Points_Y2[|Points_Y2|-1]]
Line2_X[1]:=[Points_X2[|Points_X2|-1]]

**填充直线1
tuple_gen_const (|Points_X2|, Line1_Y[0], Line1_Y1)
tuple_gen_const (|Points_X2|, Line1_X[0], Line1_X1)
tuple_gen_const (|Points_X2|, Line1_Y[1], Line1_Y2)
tuple_gen_const (|Points_X2|, Line1_X[1], Line1_X2)

**填充直线2
tuple_gen_const (|Points_X1|, Line2_Y[0], Line2_Y1)
tuple_gen_const (|Points_X1|, Line2_X[0], Line2_X1)
tuple_gen_const (|Points_X1|, Line2_Y[1], Line2_Y2)
tuple_gen_const (|Points_X1|, Line2_X[1], Line2_X2)

**直线1的点投影到直线2
projection_pl (Points_Y1, Points_X1, Line2_Y1, Line2_X1, Line2_Y2, Line2_X2, RowProj2, ColProj2)

**直线1上的点到投影点的距离
distance_pp (RowProj2, ColProj2, Points_Y1, Points_X1, Distance1)

**直线2的点投影到直线1
projection_pl (Points_Y2, Points_X2, Line1_Y1, Line1_X1, Line1_Y2, Line1_X2, RowProj1, ColProj1)
**直线2上的点到投影点的距离
distance_pp (RowProj1, ColProj1, Points_Y2, Points_X2, Distance2)

**输出两直线距离
Distance:=mean([Distance1,Distance2])

return ()

Halcon投影变换

dev_get_window (WindowHandle)
read_image (Image, 'E:/Desktop/1.jpg')
get_image_size (Image, Width, Height)
*初始化角点存放
XCoordCorners:=[]
YCoordCorners:=[]
*二值化提取前景
threshold (Image, Region, 0, 130)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, Regions, 'max_area', 70)
shape_trans (Regions, RegionTrans, 'convex')
*将前景融合为同一个前景
dilation_rectangle1(RegionTrans, RegionDilation, 11, 11)
fill_up(RegionDilation, RegionFillUp)
erosion_rectangle1(RegionFillUp, RegionErosion, 11, 11)
union1(RegionErosion, RegionUnion)
*将区域转换为轮廓线进行拟合
gen_contour_region_xld(RegionUnion, Contours, 'border')
*线段分割及拟合
segment_contours_xld(Contours, ContoursSplit, 'lines_circles', 5, 7,7)
***筛选短线
select_shape_xld (ContoursSplit, SelectedXLD1, 'contlength', 'and', 59.8, 5000000)
sort_contours_xld(SelectedXLD1, SortedContours, 'character', 'true', 'row')
gen_empty_obj(Liines)
count_obj(SortedContours, Number)
RowBegins:=[]
RowEnds:=[]
ColBegins:=[]
ColEnds:=[]
for i:=1 to Number by 1
    select_obj(SortedContours, ObjectSelected, i)
    fit_line_contour_xld(ObjectSelected, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
    gen_contour_polygon_xld (Line1, [RowBegin,RowEnd], [ColBegin,ColEnd])
    RowBegins:=[RowBegins,RowBegin]
    RowEnds:=[RowEnds,RowEnd]
    ColBegins:=[ColBegins,ColBegin]
    ColEnds:=[ColEnds,ColEnd]
    concat_obj(Liines, Line1, Liines)
endfor
dev_clear_window ()
dev_display(Liines)

*求线的交点
intersection_lines (RowBegins[0], ColBegins[0], RowEnds[0], ColEnds[0], \
                    RowBegins[1], ColBegins[1], RowEnds[1], ColEnds[1], RowUL, ColUL, IsOverlapping)
Point_UL:=[RowUL,ColUL]
intersection_lines (RowBegins[0], ColBegins[0], RowEnds[0], ColEnds[0], \
                    RowBegins[2], ColBegins[2], RowEnds[2], ColEnds[2], RowUL, ColUL, IsOverlapping)
Point_DL:=[RowUL,ColUL]
intersection_lines (RowBegins[1], ColBegins[1], RowEnds[1], ColEnds[1], \
                    RowBegins[3], ColBegins[3], RowEnds[3], ColEnds[3], RowUL, ColUL, IsOverlapping)
Point_UR:=[RowUL,ColUL]
intersection_lines (RowBegins[2], ColBegins[2], RowEnds[2], ColEnds[2], \
                    RowBegins[3], ColBegins[3], RowEnds[3], ColEnds[3], RowUL, ColUL, IsOverlapping)
Point_DR:=[RowUL,ColUL]

*求需要校正后的坐标
Trans_UL:=[0,0]
Trans_DL:=[Height,0]
Trans_UR:=[0,Width]
Trans_DR:=[Height,Width]

*计算校正矩阵
ROWS:=[Point_UL[0],Point_DL[0],Point_UR[0],Point_DR[0]]
COLS:=[Point_UL[1],Point_DL[1],Point_UR[1],Point_DR[1]]
gen_cross_contour_xld(Cross, ROWS, COLS, 50, 0)

ROWS_TRANS:=[Trans_UL[0],Trans_DL[0],Trans_UR[0],Trans_DR[0]]
COLS_TRANS:=[Trans_UL[1],Trans_DL[1],Trans_UR[1],Trans_DR[1]]
hom_vector_to_proj_hom_mat2d(ROWS, COLS, [1,1,1,1], ROWS_TRANS, COLS_TRANS,  [1,1,1,1], 'normalized_dlt', HomMat2D)
*投影变换
projective_trans_image(Image, TransImage, HomMat2D, 'bilinear', 'false', 'false')
dump_window_image (Image1, WindowHandle)
write_image (Image1, 'bmp', 0, 'E:/Desktop/Image')
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多巴胺耐受

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值