C#联合Halcon模板匹配+测量(一)

目录

1、halcon实现

2、vs实现

2.1 界面设置

2.2 准备工作 panel控件对象

2.3 实现加载图像功能


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");

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值