vs联合halcon——采集图像(实时采集与单次采集)
摘要
在对vs进行环境配置好以后,就可以开始与halcon联合进行实战。本篇就对图像的采集进行总结。通过构建采集相机GrabImage类的三个方法实现图像的采集:
- open() 打开相机
- grabimage() 单次采集图像
- close() 关闭相机,释放内存
最后用IrisSkin4实现WinForm窗体换皮肤。
先看一下实现的效果:
🧡🧡🧡🧡🧡如何实现呢?
一,创建vs工程,创建 GrabImage类(便于调用)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HalconDotNet; namespace 采集图像 { public class GrabImage { HTuple hv_AcqHandle; //打开相机窗口的引用句柄 HObject ho_Image;//定义图片变量 HTuple imageWidth, imageHeight;//定义宽高 public void open() { try { HOperatorSet.GenEmptyObj(out ho_Image);// 初始化本地图像空间的变量 //打开本地相机 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); } catch (Exception) { System.Windows.Forms.MessageBox.Show("打开相机失败!");//报错 } } //构造单次采集图像方法 public void grabimage(HWindowControl HW) { //清空窗体halconwindows HW.HalconWindow.ClearWindow(); //采集图像 HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1); //转成黑白图像 HOperatorSet.Rgb1ToGray(ho_Image, out ho_Image); //图片自适应窗口 HOperatorSet.GetImageSize(ho_Image, out imageWidth, out imageHeight); HOperatorSet.SetPart(HW.HalconWindow, 0, 0, imageHeight - 1, imageWidth - 1); //显示图像 HOperatorSet.DispObj(ho_Image, HW.HalconWindow); //以当前日期保存图像到D盘下 //HOperatorSet.WriteImage(ho_Image, "png", 0, "D:\\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss")); ho_Image.Dispose(); } //关闭相机,释放内存 public void close() { ho_Image.Dispose(); HOperatorSet.CloseFramegrabber(hv_AcqHandle); } } }
二,编写winform界面
三,编写主窗体Form1程序
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 采集图像 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } GrabImage grabimg = new GrabImage();//实例化GrabImage类 private void Form1_Load(object sender, EventArgs e) { skinEngine1.SkinFile = System.Environment.CurrentDirectory+ "\\Skins\\Calmness.ssk"; skinEngine1.DisableTag = 8888;//设置不自动换肤。tag的值8888(默认9999) grabimg.open();//调用open方法 } private void button1_Click(object sender, EventArgs e) { grabimg.grabimage(hWindowControl1); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { grabimg.close(); } private void timer1_Tick(object sender, EventArgs e) { grabimg.grabimage(hWindowControl2); } //实时采集 private void button2_Click(object sender, EventArgs e) { timer1.Start(); } //停止采集 private void button3_Click(object sender, EventArgs e) { timer1.Stop(); } } }
这里利用了一个timer控件将单次采集变成实时采集(累加计时)。
💜💜💜💜💜那么如何修改winform界面皮肤呢?
- 下载IrisSkin4.dll以及皮肤包
- 解压。将IrisSkin4.dll与Skins(皮肤)一起拷贝到项目的\bin\Debug文件夹下
- 在程序的资源管理器中的【引用】上单击右键,选择【添加引用】,找到刚才复制过来的IrisSkin4.dll文件,点击【确定】
- 点击菜单栏中的【工具】——>【选择工具箱项——>【.NET Framework组件】——>【浏览】——>找到IrisSkin4.dll——>点击【确定】,SkinEngine控件加入到工具箱 把控件添加进程序的主窗体(最简单的方法就是直接把IrisSkin4.dll文件用鼠标拖动到【浏览】界面即可)
- 在主窗体的构造函数中编辑一行代码选择皮肤,即可完成渲染。
skinEngine1.SkinFile = System.Environment.CurrentDirectory+ "\\Skins\\Calmness.ssk";
如果有需要IrisSkin4.dll以及皮肤包,可在下方评论留言。