⭐️Halcon commonly used api recitation version

⭐️Halcon commonly used api recitation version

Time calculation

count_seconds(s1)
count_seconds(s2)
Time := (s2-s1) * 1000 //Time单位是ms

Loop control

for i := 0 to num -1 by 1 
endfor

while()
endwhile


if()
endif

Control variable assignment

colors := ['red', 'yellow']
row1 := []
row2 := [323,2,3]
column1 := []
column2 := [32,23]
IndexS := []
IndexE := []
ModelIDs := []
singleNums := 12312
//追加元素
IndexS := [IndexS,12]
//求数组长度
num := |xjh| 这么做是错误的 
||只能当作参数来用,比如for i:=0 to |xjh|-1 by 1 或者raw:=[raw,12,|raw|]

Graphical variables

//图形变量数组
gen_empty_obj (Models)
//追加元素,concat是合并的意思
concat_obj(Objects1, Objects2 : ObjectsConcat : : )
concat_obj(Models, xjh ,Models)
//在Models追加xjh
gen_empty_obj (EmptyObject)
read_image(xjh, 'printer_chip/printer_chip_01')
concat_obj(EmptyObject,xjh,EmptyObject)
read_image (xjh1,'printer_chip/printer_chip_02')
concat_obj (xjh,xjh1,xjh)
//计算个数
count_obj()

Basic window operation

Every time a new file is created, it is best to write the following operations and set them first:

  1. Display font
    1. Filling method
    2. Fill color
    3. Line type
read_image()
write_image()
dev_close_window()
dev_open_window()
dev_open_window_fit_image()

get_image_size(Image : : : Width, Height) //获取图像宽高 
dev_resize_window_fit_size()

set_window_param()
dev_clear_window()

dev_set_part() //不修改图片分辨率,修改想要显示的部分 

dev_update_window()
dev_update_off()

set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_update_off ()
dev_set_draw('margin')
dev_set_color('red')
dev_set_line_width(1)

Pen color , font, etc.

basic settings

dev_set_draw(‘margin') //绘画目标是区域还是轮廓等
dev_display()
dev_set_color() //绘制颜色
dev_set_line_width()

set_display_font()
disp_message()
disp_continue_message()

write_string() //写字符道窗口

draw

set_display_font()
disp_message()
disp_continue_message()

write_string() //写字符道窗口

//在窗口中制定位置写字符串,
set_tposition(WindowHandle,20,20)
write_string(WindowHandle,"My string in the WindowHandle" + J$'d')

Graphing , matting

gen_circle()
gen_rectangle1()
gen_rectangle2()
area_center()
//抠图
reduce_domain(Image, Region : ImageReduced : : )
gen_image_const() // 空图片
unino1()
union2()

Threshold / Area / Morphology / Grayscale / Color Space Conversion

threshold()
connection()
select_shape()

fill_up()

dilation_circle()
rgb1_to_gray(Image,grayImage)
decompose(image,r,g,b)
trans_from_rgb(image1,image2,image3,h,s,v,'hsv')

Extract area conversion contour

 //自动设置shape模版图像和自动分割区域,且创建区域金字塔
inspect_shape_model (Image, ModelImages, ModelRegions, 1, 30)
//合并相邻区域,独立不同区域
connection (ModelRegions, ConnectedRegions)
//选择目标区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 100000)
//联合需要区域
union1 (SelectedRegions, ModelRegions)
//区域骨架转换轮廓
gen_contours_skeleton_xld (ModelRegions, ModelContours, 1, 'filter')

xld profile related

fit_line_contour_xld()
gen_contour_polygon_xld()

gen_contour_polygon_rounded_xld()//亚像素轮廓
paint_xld()

//读取轮廓
// 参数(输出读取的contours,文件路径,输入dxf文件控制参数名,控制参数值,Dxf文件被读取的状态信息)
read_contour_xld_dxf (Contours, 'metal-part-' + J$'02', [], [], DxfStatus)

computation

// 计算标准差,就是看看离散程度,标准差=sqrt(方差)
StdDevRows := deviation(Rows)
StdDevCols := deviation(Cols)
// 弧度
AngleStart := -rad(44)
AngleEnd := -rad(144)

Template matching

nor

// ncc模版匹配

/create_ncc_model(Template,输入单通道模版图片
			NumLevels,金字塔层数
			AngleStart, 模版最小旋转角度
			AngleExtent, 模版最大旋转角度
			AngleStep, 模版角度步长
			Metric,匹配算法
			ModelID输出模版模型句柄)
/

/find_ncc_model(Image,输入图片
			ModelID, 模版模型句柄
			AngleStart, 匹配旋转其实角度
			AngleExtent, 终止角度
			MinScore, 匹配得分最小值
			NumMatches, 匹配个数0全要
			MaxOverlap, 最大重叠率0-1
			SubPixel, 是否采用亚像素
			NumLevels,使用模版模型中第几层金字塔
			Row, 输出匹配结果的行列坐标角度和得分
			Column, Angle, Score)
/
create_ncc_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID)

find_ncc_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels : Row, Column, Angle, Score)
clear_ncc_model()
dev_display_ncc_matching_results()

shape

//主要的算子
//不带缩放的模版
create_shape_model()
/create_scaled_shape_model(Template模版图片,
					NumbLevels模板金字塔层数,=5
					AngleStart模板最小旋转角度,=0
					AngleExtent模版旋转范围,=360
					AngleStep旋转步长,'auto'
					ScaleMin最小缩放比例,=0.8
					ScaleMax最大缩放比例,=1.1
					ScaleStep缩放步长,'auto'
					Optimization优化方法,='none'
					Metric匹配标准,='ignore_global_polarity'
					Contrast对比度,=40
					MinContrast最小对比度,=10
					ModelID生成的形状模版模型句柄)
对比度小一点可能比较容易找到,但是容易带来干扰
这个算子会直接把模型坐标放到0,0角度调整到0
/
create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 'auto', 0.8, 1.0, 'auto', 'none', 'ignore_global_polarity', 40, 10, ModelID)
create_scaled_shape_model()
get_shape_model_contours() //所有的contours的位置都在0,0和angle:=0处
find_shape_model()


//带缩放的算子
/find_scaled_shape_model(Image输入图片, 
					ModelID模型句柄, 
					AngleStart旋转初始角度, 
					AngleExtent角度范围, 
					ScaleMin最小缩放比例, 
					ScaleMax最大缩放比例, 
					MinScore匹配最小得分, 
					NumMatches匹配个数, 
					MaxOverlap重叠率, 
					SubPixel亚像素级精度, 
					NumLevels模版金字塔第几层, 
					Greediness贪心度,
					Row, Column, Angle, Scale, Score匹配结果的行列坐标,缩放比例和得分值)
/
find_scaled_shape_model()
clear_shape_model()

create_aniso_shape_model() // 创建不等比例的模型匹配
find_aniso_shape_model()
clear_shape_model()

//显示模版图片,和各个区域金字塔,层数按NumLevels指定
//相当于自动求出了各个区域
inspect_shape_model(Image : ModelImages, ModelRegions : NumLevels, Contrast : )
//示例
inspect_shape_model(ImageReduced, ModelImages, ModelRegions, 4, 30)

// 标准套路
dev_update_pc('off')
dev_update_window('off')
dev_update_var('off')
read_image(Image, 'green-dot')
get_image_size(Image, Width, Height)
dev_close_window()
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
dev_set_color('red')
dev_set_draw('margin')
dev_set_line_width (1)
dev_set_colored(12)
threshold (Image, Region, 0,128)
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 13000, 16000)
fill_up(SelectedRegions, RegionFillUp)
dilation_circle(RegionFillUp, RegionDilation, 3.5)
reduce_domain(Image, RegionDilation, ImageReduced)
//create shape-contours model
/create_scaled_shape_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 0.9, 1.1, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
/
//注释掉的只能检测出完全的目标,对于只有半个模版形状的目标,无法检测
create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 'auto', 0.8, 1.0, 'auto', 'none', 'ignore_global_polarity', 40, 10, ModelID)
//获取轮廓的目的是为了显示匹配结果
get_shape_model_contours (Model, ModelID, 1) 
read_image (Image1, 'green-dots')
find_scaled_shape_model (Image1, ModelID, rad(0), rad(360), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)
for J:=0 to  |Score|-1 by 1
    vector_angle_to_rigid (0,0,0,Row[J], Column[J], Angle[J], HomMat2D)
    affine_trans_contour_xld (Model, ContoursAffineTrans, HomMat2D)
    dev_display (Image1)
    dev_display (ContoursAffineTrans)
endfor

Save, read, get parameters

//读取
raed_shape_model()
read_shape_model (ModelFile, ReusedModelID)
//获得参数
get_shape_model_contours()
get_shape_model_origin()
get_shape_model_params()
	//示例
get_shape_model_contours (ReusedShapeModel, ReusedModelID, 1)
get_shape_model_origin (ReusedModelID, ReusedRefPointRow, ReusedRefPointCol)
get_shape_model_params (ReusedModelID, NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, MinContrast)
//保存
write_shape_model()
write_shape_model (ModelID, 'green-dot.shm')

Many-to-many template matching

dev_open_window (0, 0, 646, 482, 'black', WindowHandle)
dev_set_draw ('margin')

Colors := ['red','green','cyan']

Row1 := [135,150,185]
Column1 := [250,170,220]
Row2 := [375,310,335]
Column2 := [355,395,375]


gen_empty_obj (Models)
IndexS := []
IndexE := []
ModelIDs := []

for J := 1 to 3 by 1
    read_image (Image, 'metal-parts/metal-part-model-' + J$'02d')
    gen_rectangle1 (Rectangle, Row1[J - 1], Column1[J - 1], Row2[J - 1], Column2[J - 1])
    area_center (Rectangle, Area, Row, Column)
    reduce_domain (Image, Rectangle, ImageReduced)
    inspect_shape_model (Image, ModelImages, ModelRegions, 1, 30)
    connection (ModelRegions, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 100000)
    union1 (SelectedRegions, ModelRegions)
    gen_contours_skeleton_xld (ModelRegions, ModelContours, 1, 'filter')
    create_shape_model (ImageReduced, 5, rad(0), rad(360), 'auto', 'pregeneration', 'use_polarity', 30, 7, ModelID)
    get_shape_model_contours (ModelCont, ModelID, 1)
    select_shape_xld (ModelCont, ModelContours, 'contlength', 'and', 20, 1000)

    count_obj (ModelContours, NumModel)
    count_obj (Models, NumModels)
    concat_obj (Models, ModelContours, Models)
    IndexS := [IndexS,NumModels + 1]
    IndexE := [IndexE,NumModels + NumModel]
    ModelIDs := [ModelIDs,ModelID]
endfor


Button := 0
ImgNo := 1
while (Button != 1)
    read_image (Image, 'metal-parts/metal-parts-' + ImgNo$'02d')
    //返回的Row和Column是个数组,完全取决于匹配了几个目标
    find_shape_models (Image, ModelIDs, rad(0), rad(360), 0.5, 0, 0.5, 'least_squares', 0, 0.8, Row, Column, Angle, Score, Model)
    
    //根据匹配的目标个数来进行仿射变换用来显示匹配结果
    Num := |Score|
    for J := 0 to Num - 1 by 1
        copy_obj (Models, ModelSelected, IndexS[Model[J]], IndexE[Model[J]] - IndexS[Model[J]] + 1)
        vector_angle_to_rigid (0, 0, 0, Row[J], Column[J], Angle[J], HomMat2D)
        affine_trans_contour_xld (ModelSelected, ModelTrans, HomMat2D)
        dev_set_color (Colors[Model[J]])
        dev_display (ModelTrans)
    endfor

    ImgNo := ImgNo + 1
    if (ImgNo > 15)
        ImgNo := 1
    endif

endwhile
for J := 0 to |ModelIDs| - 1 by 1
    clear_shape_model (ModelIDs[J])
endfor

Affine affine transformation

Point angle to point angle

//从点和角度计算仿射变换
/vector_angle_to_rigid(Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)
/
vector_angle_to_rigid() //获得放射矩阵
//将2维放射矩阵作用到区域中
affine_trans_region(Region : RegionAffineTrans : HomMat2D, Interpolate : )

By adding vector method

Directly input the position, angle, and zoom you want to map to, and the corresponding vector will be automatically added to the radiation matrix

// 平移,旋转,缩放
// 生成一个齐次变换矩阵
    hom_mat2d_identity (HomMat2DIdentity)
// 在矩阵中增加平移量
    hom_mat2d_translate (HomMat2DIdentity, Row[I], Column[I], HomMat2DTranslate)
// 在矩阵中增加角度量
    hom_mat2d_rotate (HomMat2DTranslate, Angle[I], Row[I], Column[I], HomMat2DRotate)
// 在矩阵中增加缩放量
    hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row[I], Column[I], HomMat2DScale)
//作用到轮廓框架中
affine_trans_contours_xld()

Measurement fit

// 基于边缘对
gen_rectangle2()
gen_measure_reactangle2()
measure_pairs()
close_measure()
// 基于非边缘对
gen_rectagnle2()
gen_measure_ractangle2()
measure_pos()
close_measure()
// 弧形测量
get_points_ellipse()
gen_measure_arc()
measure_pos()
close_measure()
// 两点距离
distance_pp()

 

 

 

Guess you like

Origin blog.csdn.net/Mrsherlock_/article/details/109653093