检测图像:
Hdevelop代码:
list_image_files ('D:/用户目录/Test', 'default', [], ImageFiles)
read_image (Image,ImageFiles[0])
gen_rectangle2 (Roi_Model, 918.272, 2649.06, rad(-47.7444), 200.86, 111.06)
reduce_domain (Image, Roi_Model, Image_model)
edges_sub_pix (Image_model, Edges, 'canny', 1, 20, 40)
create_shape_model (Image_model, 'auto', rad(0), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*以XLD创建模型查找时间较长
* create_shape_model_xld (Edges, 'auto', rad(0), rad(360), 'auto', 'auto', 'ignore_local_polarity', 5, ModelID)
get_shape_model_contours (ModelContours, ModelID, 1)
find_shape_model (Image, ModelID, rad(0), rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate)
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DTranslate)
dev_display (ContoursAffineTrans)
stop ()
DataList :=[]
DataList1 := []
for i := 0 to |ImageFiles|-1 by 1
read_image (Image1, ImageFiles[i])
find_shape_model (Image1, ModelID, rad(0), rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.5, Row1, Column1, Angle1, Score1)
get_shape_model_contours (ModelContours1, ModelID, 1)
*获取初始模型与当前查找的模型的仿射矩阵
vector_angle_to_rigid (Row, Column, Angle, Row1, Column1, Angle1, HomMat2D)
* hom_mat2d_identity (HomMat2DIdentity1)
* hom_mat2d_translate (HomMat2DIdentity1, Row1, Column1, HomMat2DTranslate1)
* hom_mat2d_rotate (HomMat2DTranslate1, Angle1, Row1, Column1, HomMat2DRotate)
affine_trans_contour_xld (Edges, ContoursAffineTrans1, HomMat2D)
dev_display (ContoursAffineTrans1)
create_metrology_model (MetrologyHandle)
create_metrology_model (MetrologyHandle1)
*找圆工具1参数
CircleModelRow := 862.411
CircleModelCol := 2949.95
CircleParam := [862.411, 2949.95, 38.5813]
*找圆工具2参数
CircleModelRow1 := 2318.84
CircleModelCol1 := 981.805
CircleParam1 := [2318.84, 981.805, 37.2123]
*圆位置变换关系
affine_trans_point_2d (HomMat2D, CircleModelRow, CircleModelCol, CircleRow, CircleCol)
affine_trans_point_2d (HomMat2D, CircleModelRow1, CircleModelCol1, CircleRow1, CircleCol1)
*添加当前圆的测量模型
*(1)_generic通用工具
* (2)_Circle找圆工具
add_metrology_object_circle_measure (MetrologyHandle, CircleRow, CircleCol, 37.721, 10, 5, 1, 80, [], [], Index)
add_metrology_object_circle_measure (MetrologyHandle1, CircleRow1, CircleCol1, 37.721, 15, 5, 1, 80, [], [], Index1)
*适应模型
apply_metrology_model (Image1, MetrologyHandle)
apply_metrology_model (Image1, MetrologyHandle1)
*获取结果
get_metrology_object_result (MetrologyHandle, Index, 'all', 'result_type', 'all_param', Parameter)
get_metrology_object_result (MetrologyHandle1, Index1, 'all', 'result_type', 'all_param', Parameter1)
*获取模型用到的点
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row2, Column2)
get_metrology_object_measures (Contours1, MetrologyHandle1, 'all', 'all', Row21, Column21)
*绘制找到的所有点
gen_cross_contour_xld (Cross, Row2, Column2, 6, 0.785398)
gen_cross_contour_xld (Cross1, Row21, Column21, 6, 0.785398)
*绘制点--->轮廓
gen_contour_polygon_xld (Contour, Row2, Column2)
gen_contour_polygon_xld (Contour1, Row21, Column21)
*拟合圆
fit_circle_contour_xld (Contour, 'geometric', -1, 100, 2, 3, 2, Row_Result, Column_Result, Radius, StartPhi, EndPhi, PointOrder)
fit_circle_contour_xld (Contour1, 'geometric', -1, 100, 2, 5, 2, Row_Result1, Column_Result1, Radius1, StartPhi1, EndPhi1, PointOrder1)
*绘制圆
gen_circle (Circle, Row_Result, Column_Result, Radius)
gen_circle (Circle1, Row_Result1, Column_Result1, Radius1)
*绘制圆心
gen_cross_contour_xld (Cross1, Row_Result, Column_Result, 6, 0)
gen_cross_contour_xld (Cross2, Row_Result1, Column_Result1, 6, 0)
*显示
dev_set_draw ('margin')
dev_display (Image1)
dev_display (ContoursAffineTrans1)
dev_display (Circle)
dev_display (Circle1)
dev_display (Cross1)
dev_display (Cross2)
*将Row,Col添加到Tuple数组
tuple_insert(DataList, |DataList|, ['Row:'+Row_Result,' Col:'+Column_Result,'\r'], DataList)
tuple_insert(DataList1, |DataList1|, ['Row:'+Row_Result1,' Col:'+Column_Result1,'\r'], DataList1)
*stop ()
endfor
*保存到txt文件
filepath := 'D:/Halcon/my.txt'
filepath1 := 'D:/Halcon/my1.txt'
file_exists (filepath, FileExists)
open_file (filepath, 'output', FileHandle)
open_file (filepath1, 'output', FileHandle1)
if (FileExists)
fwrite_string (FileHandle, DataList)
fwrite_string (FileHandle1, DataList1)
endif
检测结果: