提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Halcon以其功能强大、算法集成度高等优势,越来越受到广大视觉工程师的青睐。而C#与Halcon混合编程的方式,是目前业界比较常规的软件实现途径。下面用打开笔记本电脑摄像头的例子来说明如何通过C#来调用Halcon。C#调用Halcon的方式有很多种,这里我所介绍的是使用Halcon导出功能的方式。有关C#调用Halcon的方式,可以查询[添加链接描述](https://www.cnblogs.com/Nq1996/p/13410567.html)。
在Halcon中,通过助手(A)→打开新的Image Acquisition,选择资源→选择图像获取接口→选择DirectShow。
选择连接→设备(D)选择[0] Integrated Camera。
选择代码生成→插入代码(C)
菜单栏文件(F)→导出(x)。在导出对话框中,选择导出路径(G:/donettemp/CSDN/C#与Halcon混合编程/CombineProgram_CallCamera.cs)→选择C# - HALCON/.NET→导出范围:程序→函数属性全部打√→其他设置如图所示→点击导出按钮。
在WinForm中通过Halcon调用摄像头或图片时,必须要使用HWindowControl控件。WindForm界面工具箱中本身不存在HWindowControl控件,需要手动添加。在工具箱中右键→选择项(I)…→选择浏览→选择C:\Program Files\MVTec\HALCON-17.12-Progress\bin\dotnet35\halcondotnet.dll文件→点击打开。
在选择工具箱项中→选择HWindowControl→点击确定。
在工具箱中→所有Windows窗体中可以查看到已添加上HWindowControl。
在项目中,右键选择添加(D)→现有项(G),将Halcon导出的项目添加到WindForm项目中。
将添加进来的Halcon类中的Action函数,复制至窗体代码中。
显示报错,是因为没有引用HalconDotNet.
在项目中的引用处右键→添加引用。
添加using HalconDotNet,报错消失。
以下是完整程序。
namespace CombineProgram_CallCamera
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread callcamera;
private void Form1_Load(object sender, EventArgs e)
{
callcamera = new Thread(action);
}
private void action()
{
// Local iconic variables
HObject ho_Image = null;
// Local control variables
HTuple hv_AcqHandle = null;
// 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);
while ((int)(1) != 0)
{
ho_Image.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
//将图片输出至HWindowControl控件
HOperatorSet.DispObj(ho_Image, hWindowControl1.HalconWindow);
}
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
}
///
/// 开始采集
///
///
///
private void Start_Click(object sender, EventArgs e)
{
callcamera.Start();
}
///
/// 停止采集
///
///
///
private void stop_Click(object sender, EventArgs e)
{
callcamera.Abort();
}
}
}
点击启动,运行程序显示之前导入的Halcon类报错。
将此段程序程序屏蔽。
public class HDevelopExportApp
{
//static void Main(string[] args)
//{
// new HDevelopExport();
//}
}
点击启动,仍然报错,提示:System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”。这是由于调试平台设置不对引起的,将调试平台设置为×64。
点击启动,可以正常运行。点击采集按钮,有视频输出,点击停止按钮,停止视频输出。
最终代码如下:
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Threading.Thread;
namespace CombineProgram_CallCamera
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread callcamera;
private void Form1_Load(object sender, EventArgs e)
{
callcamera = new Thread(action);
}
private void action()
{
// Local iconic variables
HObject ho_Image = null;
// Local control variables
HTuple hv_AcqHandle = null;
// 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);
while ((int)(1) != 0)
{
ho_Image.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
//将图片输出至HWindowControl控件
HOperatorSet.DispObj(ho_Image, hWindowControl1.HalconWindow);
}
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
}
///
/// 开始采集
///
///
///
private void Start_Click(object sender, EventArgs e)
{
if (callcamera.ThreadState== ThreadState.Unstarted)
{
callcamera.Start();
}
else
{
//Resume方法微软官方已不建议使用
callcamera.Resume();
}
}
///
/// 停止采集
///
///
///
private void stop_Click(object sender, EventArgs e)
{
//Suspend方法微软官方已不建议使用
callcamera.Suspend();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (callcamera!=null&& callcamera.ThreadState!=ThreadState.Suspended)
{
callcamera.Abort();
}
if (callcamera.ThreadState == ThreadState.Suspended)
{
callcamera.Resume();
callcamera.Abort();
}
}
}
}