1.引入Halcon组件

2.项目配置文件

  <runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="halcondotnet" publicKeyToken="4973BED59DDBF2B8"/><bindingRedirect oldVersion="12.0.0.0-12.0.65535.65535" newVersion="12.0.0.0"/></dependentAssembly><dependentAssembly><assemblyIdentity name="halcondotnetxl" publicKeyToken="4973BED59DDBF2B8"/><bindingRedirect oldVersion="12.0.0.0-12.0.65535.65535" newVersion="12.0.0.0"/></dependentAssembly><dependentAssembly><assemblyIdentity name="hdevenginedotnet" publicKeyToken="4973BED59DDBF2B8"/><bindingRedirect oldVersion="12.0.0.0-12.0.65535.65535" newVersion="12.0.0.0"/></dependentAssembly><dependentAssembly><assemblyIdentity name="hdevenginedotnetxl" publicKeyToken="4973BED59DDBF2B8"/><bindingRedirect oldVersion="12.0.0.0-12.0.65535.65535" newVersion="12.0.0.0"/></dependentAssembly></assemblyBinding></runtime>

3.页面配置

4.halcon接口调用

    public partial class HDevelopExport{public int ResultN;public double usedTime;public double[] Px;public double[] Py;public double Fx, Fy;public double Cr = 9;public double Cx, Cy;public bool IsStart = false;HTuple hv_R;List<HTuple> Aa = new List<HTuple>();HTuple hv_Angle, hv_Score, hv_Runtime;HTuple hv_ModelID, hv_Row, hv_Column;HObject ho_Mask;HTuple hv_S1, hv_S2;HObject ho_Image, ho_Rectangle, ho_ImageReduced;public HTuple hv_ExpDefaultWinHandle;HWindowControl HWindowControl;/// <summary>/// 打开相机/// </summary>public void OpenCamera(){//hv_ExpDefaultWinHandle = Window;HOperatorSet.GenEmptyObj(out ho_Image); // 生ho_Image数据区// Grabbing images from a Daheng USB 2.0 cameraHOperatorSet.CloseAllFramegrabbers();HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",-1, "false", "default", "[0] Integrated Camera", 0, -1, out hv_Angle);HOperatorSet.SetFramegrabberParam(hv_Angle, "tilt", -3);HOperatorSet.GrabImageStart(hv_Angle, -1);//open camera with default settings}/// <summary>/// 关闭相机/// </summary>public void CloseCamera(){HOperatorSet.CloseAllFramegrabbers();}/// <summary>/// 实时播放/// </summary>public void RealTimePlayback(){IsStart = true;//HObject ho_Image = null;//HTuple hv_AcqHandle = new HTuple();Initialize local and output iconic variables //HOperatorSet.GenEmptyObj(out ho_Image);Image Acquisition 01: Code generated by Image Acquisition 01//HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",//    -1, "false", "default", "[0] Integrated Camera", 0, -1, out hv_AcqHandle);//HOperatorSet.GrabImageStart(hv_AcqHandle, -1);Task task = new Task(() =>{while (IsStart){ho_Image.Dispose();HOperatorSet.GrabImageAsync(out ho_Image, hv_Angle, -1);HTuple hv_Width, hv_Height;HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); // 获取图片的尺寸double ratioWidth = (1.0) * hv_Width[0].I / HWindowControl.Width;double ratioHeight = (1.0) * hv_Height[0].I / HWindowControl.Height;HTuple row1, column1, row2, column2;if (ratioWidth >= ratioHeight){row1 = -(1.0) * ((HWindowControl.Height * ratioWidth) - hv_Height) / 2;column1 = 0;row2 = row1 + HWindowControl.Height * ratioWidth;column2 = column1 + HWindowControl.Width * ratioWidth;HOperatorSet.SetPart(hv_ExpDefaultWinHandle, row1, column1, row2, column2);HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);}}});task.Start();}/// <summary>/// 拍照/// </summary>public void Photograph(){IsStart = true;HTuple hv_Width, hv_Height;ho_Image.Dispose(); // 清除ho_Image中的数据HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle); // 采集图像HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); // 获取图片的尺寸double ratioWidth = (1.0) * hv_Width[0].I / HWindowControl.Width;double ratioHeight = (1.0) * hv_Height[0].I / HWindowControl.Height;HTuple row1, column1, row2, column2;if (ratioWidth >= ratioHeight){row1 = -(1.0) * ((HWindowControl.Height * ratioWidth) - hv_Height) / 2;column1 = 0;row2 = row1 + HWindowControl.Height * ratioWidth;column2 = column1 + HWindowControl.Width * ratioWidth;HOperatorSet.SetPart(hv_ExpDefaultWinHandle, row1, column1, row2, column2);HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);// 显示ho_Image中的图片HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, "margin"); // 填充模式为只画框HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red"); // 画线颜色红HOperatorSet.DispRectangle1(hv_ExpDefaultWinHandle, row1, column1, row2, column2);}}/// <summary>/// 初始化相机/// </summary>public void InitHalcon(){// Default settings used in HDevelop HOperatorSet.SetSystem("width", 512);HOperatorSet.SetSystem("height", 512);}/// <summary>/// 初始化Halcon/// </summary>/// <param name="Window"></param>public void RunHalcon(HWindowControl Window){HWindowControl = Window;hv_ExpDefaultWinHandle = Window.HalconWindow;}/// <summary>/// 设置模板/// </summary>public void SetTemplate(){HTuple hv_Row1, hv_Column1, hv_Row2, hv_Column2;MessageBox.Show("在红框中按下鼠标左键画方框选模板,按右键结束");HOperatorSet.DrawRectangle1(hv_ExpDefaultWinHandle,out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2);HOperatorSet.GenRectangle1(out ho_Rectangle, hv_Row1, hv_Column1, hv_Row2, hv_Column2);HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced);HOperatorSet.WriteImage(ho_ImageReduced, "png", 0, "E:/test.png");MessageBox.Show("模板已保存");}/// <summary>/// 从文件中读取模板/// </summary>public void ReadTemplate(){HOperatorSet.GenEmptyObj(out ho_ImageReduced);ho_ImageReduced.Dispose();HOperatorSet.ReadImage(out ho_ImageReduced, "E:/test.png");}/// <summary>/// 模板匹配/// </summary>public void MatchTemplate(){int i, j;double temp;HOperatorSet.GenRectangle1(out ho_Rectangle, 320, 250, 630, 750);HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_Mask);//Reduce image rangeHOperatorSet.CreateShapeModel(ho_ImageReduced, "auto", (new HTuple(-45)).TupleRad(), (new HTuple(90)).TupleRad(), "auto", "auto", "use_polarity", "auto", "auto", out hv_ModelID);HOperatorSet.CountSeconds(out hv_S1); // Match startHOperatorSet.FindShapeModel(ho_Mask, hv_ModelID, (new HTuple(-45)).TupleRad(), (new HTuple(90)).TupleRad(), 0.5, 3, 0.0, "least_squares", 0, 0.5, out hv_Row, out hv_Column, out hv_Angle, out hv_Score);HOperatorSet.CountSeconds(out hv_S2); // Match stophv_Runtime = (hv_S2 - hv_S1) * 1000;usedTime = hv_Runtime;ResultN = new HTuple(hv_Row.TupleLength());// 获取匹配结果个数if (ResultN > 0){Px = new double[ResultN];Py = new double[ResultN];hv_R = new HTuple(); //HTuple变量初始化for (i = 0; i < ResultN; i++){Py[i] = hv_Row[i]; // 将搜索结果的中心坐标读出Px[i] = hv_Column[i];Aa.Add(hv_Angle[i]);hv_R[i] = 8; //设置圆半径}for (i = 0; i < ResultN; i++) // 从大到小排序{for (j = i + 1; j < ResultN; j++){if (Px[i] < Px[j]){temp = Px[i];Px[i] = Px[j];Px[j] = temp;temp = Py[i];Py[i] = Py[j];Py[j] = temp;temp = Aa[i];Aa[i] = Aa[j];Aa[j] = temp;}}}HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red"); // 显示匹配结果位置HOperatorSet.DispCircle(hv_ExpDefaultWinHandle, hv_Row, hv_Column, hv_R);HOperatorSet.ClearShapeModel(hv_ModelID);Cy = Py[0] + 10; // offset的初始值Cx = Px[0] + 60;}else{MessageBox.Show("匹配失败!?");}}/// <summary>/// 显示偏移点位置/// </summary>public void DisplayOffset(){HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red");HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);HOperatorSet.DispCircle(hv_ExpDefaultWinHandle, hv_Row, hv_Column, hv_R);HOperatorSet.DispLine(hv_ExpDefaultWinHandle, hv_Row[0], hv_Column[0], hv_Row[1], hv_Column[1]);HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "yellow");HOperatorSet.DispCircle(hv_ExpDefaultWinHandle, Cy, Cx, Cr);}/// <summary>/// /显示计算角度,划线/// </summary>public void DisplayLine(){HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "yellow");HOperatorSet.DispLine(hv_ExpDefaultWinHandle, Cy, Cx, Fy, Fx);}}

5.form1cs页面

        public Form1(){InitializeComponent();timer1.Tick += Timer1_Tick;timer1.Interval = 5000;this.Controls.Add(hWindowControl1);hWindowControl1.Location = new System.Drawing.Point(20, 20);hWindowControl1.Width = 500;hWindowControl1.Height = 500;hd.InitHalcon();}private void Form1_Load(object sender, EventArgs e){hd.RunHalcon(hWindowControl1); // 摄像头初始化}/// <summary>/// 打开相机/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnOpenCamera_Click(object sender, EventArgs e){hd.OpenCamera();textBox1.Text = "";textBox1.Refresh();}/// <summary>///关闭相机/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnCloseCamera_Click(object sender, EventArgs e){hd.CloseCamera();}/// <summary>/// 匹配/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnMatch_Click(object sender, EventArgs e){int j, m;double d;double[] x;double[] y;hd.MatchTemplate(); // 图像匹配m = hd.ResultN;x = new double[m];y = new double[m];for (j = 0; j < m; j++) // 获取匹配坐标{x[j] = hd.Px[j];y[j] = hd.Py[j];}textBox1.Text = "匹配时间:" + hd.usedTime.ToString("#####.##") + " ms" + "\r\n" + "\r\n";for (j = 0; j < m; j++){if (j < m - 1) // 计算2点距离{d = (y[j + 1] - y[j]) * (y[j + 1] - y[j]) + (x[j + 1] - x[j]) * (x[j + 1] - x[j]);d = Math.Sqrt(d);d = 0.0485 * d;textBox1.Text = textBox1.Text + "d(" + Convert.ToString(j + 1) + ") = " + d.ToString("#####.##")+ "mm" + "\r\n";}textBox1.Text = textBox1.Text + "x(" + Convert.ToString(j + 1) + ") = " + Convert.ToString(x[j]) + " y(" + Convert.ToString(j + 1) + ") = " + Convert.ToString(y[j]) + "\r\n" + "\r\n";}}/// <summary>/// 设置模板/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnTemplate_Click(object sender, EventArgs e){hd.SetTemplate();}/// <summary>/// 加载模板/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnLoadTemplate_Click(object sender, EventArgs e){hd.ReadTemplate();}/// <summary>/// 实时播放/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnPlayback_Click(object sender, EventArgs e){hd.RealTimePlayback();}/// <summary>/// 显示结果/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnDisplayResults_Click(object sender, EventArgs e){double a, b, c, d, m, n;double alpha, beta;a = hd.Px[0];b = hd.Py[0];c = hd.Px[0];d = hd.Py[0];alpha = Math.Atan((d - b) / (c - a));beta = theta + alpha;m = a + Lam * Math.Cos(beta);n = b + Lam * Math.Sin(beta);textBox1.Text = textBox1.Text + " m = " + Convert.ToString(m) + "\r\n" + "n = " + Convert.ToString(n) + "\r\n" + "alpha = " + Convert.ToString(alpha) + "\r\n" + " theta = " + Convert.ToString(theta) + "\r\n" + " beta = " + Convert.ToString(beta);hd.Cx = m;hd.Cy = n;hd.Fx = m - 600 * Math.Cos(alpha); // 计算夹角斜线的终点坐标hd.Fy = n - 600 * Math.Sin(alpha);hd.DisplayOffset(); // 显示插针位置hd.DisplayLine(); // 显示工件夹角}/// <summary>/// 拍照/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnPhotograph_Click(object sender, EventArgs e){hd.Photograph();}

C# HalconDotNet 工业视觉处理相关推荐

  1. 品质检测破局:工业视觉检测云平台为智能制造“点睛”

    微波炉角落里的型号编码.空调背面不显眼的小螺钉.冰箱侧身的标签,它们的质量检测是生产线中最费人工的地方,也是制约智能制造的老大难. 如果哪天这类瑕疵检测不再需要人工,这样的制造就真的称得上智能.最近, ...

  2. 智能工厂的关键:基于机器学习的工业视觉

    https://www.toutiao.com/a6638741688971952654/ 在"机器视觉"中应用自动学习技术可以更好地了解整个生产过程,预测可能出现的问题. &qu ...

  3. 工业视觉镜头NAVITAR

    品牌介绍 美国NAVITAR是优越的上等光学系统制造商和供应商,工业视觉镜头NAVITAR为机器视觉.检测和生物医学诊断行业提供的定制光学解决方案. 工业视觉镜头NAVITAR用于鉴定产品.检查产品缺 ...

  4. 工业视觉智能实战经验之IVI算法框架2.0

    简介: 工业视觉智能团队在交付了多个工业视觉智能质检项目后,发现了工业视觉智能的共性问题和解法,打造了工业视觉智能平台,通过平台的方式积累和提升工业视觉的通用能力.在平台建设上最核心的能力是算法能力. ...

  5. 商汤科技「工业视觉AI」研发介绍

    关注公众号,获取更多AI领域发展机会 本文转载自知乎,已获作者授权转载,请勿二次转载. 链接:https://zhuanlan.zhihu.com/p/352296543 作者介绍 吴立威,商汤科技研 ...

  6. 天池又上工业视觉检测算法大赛:瓶装白酒疵品质检

    点击我爱计算机视觉标星,更快获取CVML新技术 昨天跟大家推荐了一本Halcon的新书 如何开展工业视觉检测?Halcon 圣经告诉你答案 ,不少朋友对工业视觉检测这个方向很感兴趣,恰好天池最近又新上 ...

  7. 如何开展工业视觉检测?Halcon 圣经告诉你答案

    点击我爱计算机视觉标星,更快获取CVML新技术 在工业产品视觉检测领域,Halcon 绝对是人尽皆知的存在.其众多且完整的技术方案和出众的计算性能,是高质量项目开发的保证(当然代价是付费). 上个月北 ...

  8. 工业视觉中的目标检测——兼谈天池大赛优胜方案

    点击我爱计算机视觉标星,更快获取CVML新技术 目标检测是计算机视觉领域研究最火热的方向,这从计算机视觉顶会CVPR相关论文数量就能看得出来. 目标检测应用范围广泛,上至卫星遥感,下至自动驾驶,大到鲸 ...

  9. 银河水滴打响步态识别商用第一枪!3大产品1.35亿订单,工业视觉平台免费开放...

    李根 发自 凹非寺  量子位 报道 | 公众号 QbitAI 你知道么?每个人的走路的步态都是独一无二的. 之前,你可能在<碟中谍>中看过步态识别技术,被用于高级别机密的身份验证. 但从今 ...

最新文章

  1. RabbitMQ 的引言
  2. C++的一些知识点摘抄(创建基本类 高级类)
  3. RecyclerView的使用和样式
  4. AUTOSAR专业知识篇(八)-ID.3 和大众的电气化平台
  5. canvas离屏技术与放大镜实现
  6. iOS 里const在修饰对象时候的用法
  7. html同学录设计模板,同学录封面
  8. leetcode题解20-有效的括号
  9. 《Mastering opencv....读书笔记》基于标记的虚拟现实
  10. java中的常见算法
  11. U8普及版在win7系统中,UFO报表一点打印或预览就报错
  12. 转载:技术大停滞——范式春梦中的地球工业文明5:台阶前的坑:人类社会的宿命
  13. 新唐(Nuvoton)8051单片机开发指南
  14. 大学十年__献给计算机专业的所有学子
  15. D类音频功放(CS8120例)
  16. 论电子商务平台成功的几个关键点
  17. python获得用户输入的一个字符串(长度3)_Python笔记(3)-字符串
  18. 2018 shenyang ICPC E - The Kouga Ninja Scrolls
  19. 【愚公系列】2023年02月 WMS智能仓储系统-006.租户功能的配置
  20. 如果你的好文得不到更高的阅读和互动,那来吧

热门文章

  1. oledbdatareader和OleDbDataAdapter之间的区别
  2. webApp开发心得
  3. List集合详细讲解
  4. BAT批处理文件 if命令详解
  5. 深演智能拟创业板上市:已完成多轮融资,中移动、深创投等为股东
  6. Wifi关闭状态下获取Wifi列表
  7. UE4 编辑器代码中如何区分不同的客户端窗口(UE4多开窗口)?
  8. maven配置文件中modules的作用
  9. 火线精英显示服务器一断,火线精英黑屏的处理办法总结
  10. 今天面了个字节跳动拿35K出来的,真是砂纸擦屁股,给我露了一手啊