实现思路:首先拍一张图片作为模版,然后对需要检测的图片进行目标匹配,可区分正反,并输出正确目标的中心点位置,以及输出目标的旋转角度
废话不多说,上代码
* 定义常数 pi
pi := 3.141592653589793
* 打开窗口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
* 显示图像
read_image (Image, 'K:/1/11.jpg')
dev_display (Image)
* 创建固定矩形 ROI 区域
gen_rectangle1 (ModelRegion, 100, 100, 400, 400)
* 将图像裁剪到模板区域
reduce_domain (Image, ModelRegion, TemplateImage)
* 创建形状模型
create_shape_model (TemplateImage, 5, rad(0), rad(360), rad(1.0046), ['none','no_pregeneration'], 'use_polarity', [13,26,4], 4, ModelID)
* 获取模型轮廓用于后续变换和显示
get_shape_model_contours (ModelContours, ModelID, 1)
* 设置显示参考位置
smallest_rectangle1_xld (ModelContours, Row1, Column1, Row2, Column2)
RefRow := (max(Row2)-min(Row1))/2
RefColumn := (max(Column2)-min(Column1))/2
vector_angle_to_rigid (0, 0, 0, RefRow, RefColumn, 0, HomMat2D)
affine_trans_contour_xld (ModelContours, TransContours, HomMat2D)
* 显示模型轮廓
dev_display (Image)
dev_set_color ('green')
dev_set_draw ('margin')
dev_display (TransContours)
* 结束模型初始化
* Matching 01: END of generated code for model initialization
* 开始模型应用
* 处理测试图像
TestImages := ['K:/1/1-3.jpg']
for T := 0 to |TestImages| - 1 by 1
read_image (Image, TestImages[T])
* 设置较低的分数阈值和较高的匹配数量以检测更多目标
find_shape_model (Image, ModelID, rad(0), rad(360), 0.9, 10, 0.5, 'least_squares', [5,1], 0.75, Row, Column, Angle, Score)
* 检测并显示多个目标
dev_display (Image)
for I := 0 to |Score| - 1 by 1
hom_mat2d_identity (HomMat2D)
hom_mat2d_rotate (HomMat2D, Angle[I], 0, 0, HomMat2D)
hom_mat2d_translate (HomMat2D, Row[I], Column[I], HomMat2D)
affine_trans_contour_xld (ModelContours, TransContours, HomMat2D)
dev_set_color ('green')
dev_display (TransContours)
* 将角度值限制在 0 到 2π 之间
if (Angle[I] < 0)
Angle[I] := Angle[I] + 2 * pi
endif
if (Angle[I] >= 2 * pi)
Angle[I] := Angle[I] - 2 * pi
endif
* 将弧度转换为度数
AngleInDegrees := Angle[I] * 180 / pi
* 打印检测到目标的中心点和旋转角度(度数),并换行
write_string (WindowHandle, '目标中心点: Row: ' + Row[I]$'.2f' + ', Column: ' + Column[I]$'.2f')
write_string (WindowHandle, ', Angle: ' + AngleInDegrees$'.2f' + ' degrees')
write_string (WindowHandle, ' ')
endfor
endfor
模板图片和效果图片如下(输出打印文字根据自己需求进行修改):