halcon联合C#作图像的实时采集
1、做好halcon图像采集代码并将其转化为C#语言
2、打开VS2017选择Windows窗体应用程序并设置命名工程名称与保存路径。如下图:
在Form1上进行工具的填写
单击引用在右击添加引用,图中若不显示大框中的部分,浏览引用的路径为halcon安装目录下的bin->dotnet35下的halcondotnet.dll(动态链接库),若不知道在哪里,可回到桌面右击halcon图标查看文件所在位置,然后回到VS217单击浏览按钮做如下图操作:
出现箭头所指表示引用成功
添加好应用之后,继续在工具箱中添加显示halcon窗体的控件,如下图步骤所示:
单击浏览选择上一步路径下的halcondotnet.dll(动态链接库),确定后若出现如下图的内容说明添加成功,然后点击确认即可。
如果出现下面两个选项表示添加成功,如下图:
此时就可以放工具hwindowcontrol在白板上了,如下图:
此时C#与halcon的联合就完全做完了,接下来做工具功能填充,如下图:
注意事项:定时器的响应周期设置为40ms。
halcon相机代码如下:
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', '08eded540710_DahuaTechnologyPBP_13MGXnpXp', 0, -1, AcqHandle) set_framegrabber_param (AcqHandle, 'ExposureTime', 2000.0) set_framegrabber_param (AcqHandle, 'GainRaw', 8.0) set_framegrabber_param (AcqHandle, 'Brightness', 50) grab_image_start (AcqHandle, -1) while (true) grab_image_async (Image, AcqHandle, -1) * Image Acquisition 01: Do something endwhile close_framegrabber (AcqHandle)
转换后的C#代码为:
//
// File generated by HDevelop for HALCON/.NET (C#) Version 17.12
//
using HalconDotNet;
public partial class HDevelopExport
{
#if !(NO_EXPORT_MAIN || NO_EXPORT_APP_MAIN)
public HDevelopExport()
{
// Default settings used in HDevelop
HOperatorSet.SetSystem("width", 512);
HOperatorSet.SetSystem("height", 512);
if (HalconAPI.isWindows)
HOperatorSet.SetSystem("use_window_thread","true");
action();
}
#endif
#if !NO_EXPORT_MAIN
// Main procedure
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
//Image Acquisition 01: Attention: The initialization may fail in case parameters need to
//Image Acquisition 01: be set in a specific order (e.g., image resolution vs. offset).
HOperatorSet.OpenFramegrabber("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive",
-1, "default", -1, "false", "default", "08eded540710_DahuaTechnologyPBP_13MGXnpXp",
0, -1, out hv_AcqHandle);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "ExposureTime", 2000.0);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "GainRaw", 8.0);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "Brightness", 50);
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.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
}
#endif
}
#if !(NO_EXPORT_MAIN || NO_EXPORT_APP_MAIN)
public class HDevelopExportApp
{
static void Main(string[] args)
{
new HDevelopExport();
}
}
#endif
最后联合C#编写
1、在WinForm界面上依次双击打开相机按钮、图像采集按钮、关闭相机按钮,定时器timer1的方法程序。
2、找到halcon导出的C#文件双击进去,然后找到using HalconDotNet;的命名空间并将其拷贝到WinForm界面程序中,导出的C#程序如下。
3、在上述的C#程序中,只需关注action函数里面的,其中变量放在打开相机按钮方法的前面,程序如下:
//定义变量
HObject ho_Image=null;
HTuple hv_AcqHandle = null;
4、while与变量之间的程序放在打开相机按钮方法里面,程序如下:
//打开相机按钮的办法
HOperatorSet.GenEmptyObj(out ho_Image);
HOperatorSet.OpenFramegrabber("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive",
-1, "default", -1, "false", "default", "08eded540710_DahuaTechnologyPBP_13MGXnpXp",
0, -1, out hv_AcqHandle);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "ExposureTime", 2000.0);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "GainRaw", 8.0);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "Brightness", 50);
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
5、启动定时器的程序放在图像采集按钮的方法里面,程序如下:
//图像采集按钮的方法
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
6、关闭相机与停止定时器的程序放在关闭相机按钮方法里面,程序如下:
//关闭相机按钮的方法
private void button3_Click(object sender, EventArgs e)
{
HOperatorSet.CloseFramegrabber(hv_AcqHandle); //关闭相机
timer1.Enabled = false; //停止定时器
}
7、定时器中的程序为while语句中的代码段,程序如下:
//定时器响应的方法
private void timer1_Tick(object sender, EventArgs e)
{
ho_Image.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
}
}
8、为了将halcon窗口覆盖到WinForm界面的窗体上,找到HOperatorSet.OpenWindow修改参数,修改内容如下:
原程序HOperatorSet.OpenWindow(0,0,512,512,0,“visible”,"",out hv_WindowHandle);
修改程序:
HOperatorSet.OpenWindow(0, 0, hWindowControl1.Width, hWindowControl1.Height, hWindowControl1.HalconWindow, “visible”, “”, out hv_WindowHandle);
借鉴博客https://blog.csdn.net/weixin_39800738/article/details/98596583?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160626496219725225008242%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160626496219725225008242&biz_id=0&spm=1018.2118.3001.4449内容,谢谢原作的分享