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')