创建第一个打开摄像头的上位机界面
1.创建C#项目并配置Halcon环境
1.1创建项目。打开vs2022创建新项目
语言选择c#,选择Windows窗体应用(.NET Framework)
根据自己需要,更改项目名称,项目位置。框架选择最新版本
出现以下界面表示创建成功
1.2 配置环境,在c#中调用halcon
1.2.1 添加HWindowControl控件
在WinForm中通过Halcon调用摄像头或图片时,必须要使HWindowControl控件。WindForm界面工具箱中本身不存在HWindowControl控件,需要手动添加。在工具箱中右键→选择项(I)…→选择浏览→选择D:\Halcon21.11\HALCON-21.11-Progress\bin\dotnet35\halcondotnet.dll文件→点击打开。
在工具箱里搜索,出现下面两个表示添加成功
1.2.2 添加项目引用
浏览的位置是halcon的安装路径中
出现下图表示添加引用成功
2.Halcon导出打开摄像头的程序
在Halcon中,通过助手(A)→打开新的Image Acquisition,选择资源→选择图像获取接口→选择DirectShow。
点击连接,可以看到设备信息
选择代码生成→插入代码,之后会在程序窗口显示代码
选则文件→导出语言,选择如下图
3. C#上位机界面打开摄像头
首先在设计界面放两个Button和一个HWindowControl
完整代码,注意在代码开头
namespace OpenCamera
{
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 = new HTuple();
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Image);
//Image Acquisition 01: Code generated by Image Acquisition 01
hv_AcqHandle.Dispose();
HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",
-1, "false", "default", "[1] Intel(R) RealSense(TM) Depth Camera 435 with RGB Module RGB",
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);
//Image Acquisition 01: Do something
HOperatorSet.DispObj(ho_Image, hWindowControl1.HalconWindow);
}
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
hv_AcqHandle.Dispose();
}
private void button1_Click(object sender, EventArgs e)
{
if (callcamera.ThreadState== ThreadState.Unstarted)
{
callcamera.Start();
}
else
{
//Resume方法微软官方已不建议使用
callcamera.Resume();
}
}
private void button2_Click(object sender, EventArgs e)
{
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();
}
}
}