目录
1、halcon实现
可以随意使用halcon案例中相关的模板匹配+测量案例,以下代码仅供参考
***********1..创建定位模板************
dev_set_draw ('margin')
dev_set_line_width (2)
list_files ('C:/PTT/Image', 'files', Files)
tuple_regexp_select (Files, ['\\.(png|jpg|bmp)'], ImageFiles)
read_image (Image, ImageFiles[0])
get_image_size (Image, Width, Height)
gen_rectangle1 (ROI_0, 185.922, 187.828, 303.797, 410.766)
line_orientation (185.922, 187.828, 303.797, 410.766, Phi)
area_center (ROI_0, Area, Row, Column)
reduce_domain (Image, ROI_0, ImageReduced)
create_shape_model (ImageReduced, 4, rad(0), rad(360), 'auto', 'auto', 'use_polarity', [20,40], 10, ModelID)
*创建模板ModelContours
get_shape_model_contours (ModelContours, ModelID, 1)
gen_rectangle2 (ROI_check, 160, 302, 0, 162.776, 7)
*生成测量ROI
gen_rectangle2_contour_xld (Rectangle_XLD, 140, 302, 0, 162.776, 7)
***********2.开始模板定位************
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
hom_mat2d_identity (HomMat2DIdentity)
for Index := 0 to |ImageFiles|-1 by 1
read_image (Images, ImageFiles[Index])
find_shape_model (Images, ModelID, rad(0), rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle, Score)
*模板仿射
hom_mat2d_translate (HomMat2DIdentity, Row1, Column1, HomMat2DTranslate)
hom_mat2d_rotate (HomMat2DTranslate, Angle, Row1, Column1, HomMat2DRotate)
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DRotate)
*测量ROI仿射
vector_angle_to_rigid (Row, Column,0, Row1, Column1, Angle, HomMat2D)
affine_trans_contour_xld (Rectangle_XLD, ContoursAffineTrans, HomMat2D)
area_center_xld (ContoursAffineTrans, Area1, Row2, Column2, PointOrder)
*3.测量
scale_image (Images, ImageScaled, 2.5, 0)
gen_measure_rectangle2 (Row2, Column2, Angle, 160, 7, Width, Height, 'nearest_neighbor', MeasureHandle)
measure_pairs (ImageScaled, MeasureHandle, 1, 50, 'all', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, IntraDistance1)
gen_cross_contour_xld (Cross, RowEdgeFirst, ColumnEdgeFirst, 10, rad(45))
*可视化观察测试结果
disp_line (WindowHandle, RowEdgeFirst-8*cos(Angle), ColumnEdgeFirst-8*sin(Angle), RowEdgeFirst+8*cos(Angle), ColumnEdgeFirst+8*sin(Angle))
disp_line (WindowHandle, RowEdgeSecond-8*cos(Angle), ColumnEdgeSecond-8*sin(Angle), RowEdgeSecond+8*cos(Angle), ColumnEdgeSecond+8*sin(Angle))
*计算
distance1:=mean([IntraDistance,IntraDistance1])
distanceMin:=min([IntraDistance,IntraDistance1])
*结果显示
dev_disp_text ('引脚间隔平均值为:'+distance1$'0.4'+'px', 'window', 12, 12, 'black', [], [])
dev_disp_text ('引脚间隔最小值为:'+distanceMin$'0.4'+'px', 'window', 32, 12, 'black', [], [])
dev_disp_text ('引脚总数为:'+|[IntraDistance,IntraDistance1]|, 'window', 52, 12, 'black', [], [])
close_measure (MeasureHandle)
dev_close_window ()
endfor
2、vs实现
2.1 界面设置
根据需求添加相应的控件,该案例使用panel实现图像显示。
2.2 准备工作—设置panel控件对象
可以理解为:控制图像窗口的指针/接口
注意在外围生成图像控件的声明 private HSmartWindowControl hsWControl;
private void Form1_Load(object sender, EventArgs e)
{
//创建图像控件对象,以填充的方式,添加到panel容器里面
hsWControl = new HSmartWindowControl();
hsWControl.Dock = DockStyle.Fill;
panel1.Controls.Add(hsWControl);
}
2.3 实现加载图像功能
注意在外围生成图像变量的声明 private HImage ho_imge;
private void button1_Click_1(object sender, EventArgs e)
{
//使用文件对话框类OpenFileDialog,指定过滤文件
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "选择模板图像|*.png";
if(ofd.ShowDialog()==DialogResult.OK )
{
//获取路径,通过路径创建图像,显示,并设置让图像自适应容器大小(等比例缩放不失真)
string filePath = ofd.FileName;
ho_imge = new HImage(filePath);
hsWControl.HalconWindow.DispObj(ho_imge);
hsWControl.SetFullImagePart();
}
}
番外+
OpenfileDialog:功能类,使用可弹出一个文件对话框。
- Title:设置对话框的标题文字。
- Multiselect:设置是否允许选择多个文件,默认值为 false。若设置为 true,则可以按住 Ctrl 或 Shift 键,同时选择多个文件。
- Filter:设置可以选择的文件类型,格式为 “描述文字|文件类型”,多个类型之间用竖线 | 隔开。若不设置,则默认所有文件都可以选择
- ShowDialog():显示打开文件的对话框,并返回对话框结果。如果用户选择了文件,对话框结果为 true;如果用户取消选择,对话框结果为 false。
- FileNames:获取用户选择的文件名,如果 Multiselect 属性为 true,则返回一个字符串数组;否则返回一个长度为 1 的字符串数组。
- FileName:获取用户选择的第一个文件名,等同于 FileNames[0]。
实现多个文件遍历,使用容器存储。
List<string> imageListPath· = GetOpenFilesPath("选择图片文件", true, "PNG 文件(*.png)|*.png|JPG 文件(*.jpg)|*.jpg)|BMP文件(*.bmp");