摘要

在對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介面面板呢?

  1. 下載IrisSkin4.dll以及面板包
  2. 解壓。將IrisSkin4.dll與Skins(面板)一起拷貝到專案的\bin\Debug資料夾下
  3. 在程式的資源管理器中的【引用】上單擊右鍵,選擇【新增引用】,找到剛才複製過來的IrisSkin4.dll檔案,點選【確定】
  4. 點選選單欄中的【工具】——>【選擇工具箱項——>【.NET Framework元件】——>【瀏覽】——>找到IrisSkin4.dll——>點選【確定】,SkinEngine控制元件加入到工具箱 把控制元件新增程序序的主窗體(最簡單的方法就是直接把IrisSkin4.dll檔案用滑鼠拖動到【瀏覽】介面即可)
  5. 在主窗體的建構函式中編輯一行程式碼選擇面板,即可完成渲染。
skinEngine1.SkinFile = System.Environment.CurrentDirectory+ "\\Skins\\Calmness.ssk";

如果有需要IrisSkin4.dll以及面板包,可在下方評論留言。