vs聯合halcon——採集影像(實時採集與單次採集)
- 2021 年 6 月 27 日
- 筆記
- halcon筆記, Visual Studio聯合Haclon, c++/c#筆記
摘要
在對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以及皮膚包,可在下方評論留言。

