文章实时采集( 启蒙续集之Halcon联合C#以及手眼以及标定实时采集方法)
优采云 发布时间: 2021-10-30 22:22文章实时采集(
启蒙续集之Halcon联合C#以及手眼以及标定实时采集方法)
Halcon结合C#实时采集图像 Halcon结合C#实时采集图像
内容中引用的学习课程为超人视频:Halcon结合C#和手眼校准
实时采集方法有四种:循环采集、定时器、多线程、回调函数
这篇文章在之前的代码上做了改进,所以我把之前的代码复制了一份,再次打开发现这个界面:
如何打开 C# 设计窗口:
改进过程:
1.halcon 部分
在halcon中打开采集助手,自动检测接口,连接,实时,插入代码
Halcon 代码的一部分是:
* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', 8, 'rgb', -1, 'false', 'default', '0030532361ef_Basler_acA160020gc', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
grab_image_async (Image, AcqHandle, -1)
get_image_size (Image, Width, Height)
dev_set_part (0, 0, Height, Width)
endwhile
close_framegrabber (AcqHandle)
2.C#部分
配置如上一篇文章,我直接用上次代码改了,所以没有重新配置。
添加控件定时器,属性栏如下。定时器方法不准确,间隔越长越不准确。单击闪电符号,Interval 更改为 40ms,事件将在 40ms 后执行。定时器开启后,不要采集关闭,否则会出现错误:HALCON error #2454: HALCON handle has already clear in operatorgrab_image_async
下一步就是双击不同的控件,然后将halcon导出的代码复制粘贴到相应位置即可。
在Halcon导出的C#代码中,只需要关注action函数中的代码即可:
// Local iconic variables
HObject ho_Image=null;
// Local control variables
HTuple hv_AcqHandle = new HTuple(), hv_Width = new HTuple();
HTuple hv_Height = 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("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive",
8, "rgb", -1, "false", "default", "0030532361ef_Basler_acA160020gc", 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);
hv_Width.Dispose();hv_Height.Dispose();
HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
if (HDevWindowStack.IsOpen())
{
HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);
}
}
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
hv_AcqHandle.Dispose();
hv_Width.Dispose();
hv_Height.Dispose();
打开相机部分的代码:
#region 打开相机
private void button3_Click(object sender, EventArgs e)
{
//清空、打开、初始化相机
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Timg);
//Image Acquisition 01: Code generated by Image Acquisition 01
hv_AcqHandle.Dispose();
HOperatorSet.OpenFramegrabber("GigEVision2", 0, 0, 0, 0, 0, 0, "progressive",
8, "rgb", -1, "false", "default", "0030532361ef_Basler_acA160020gc", 0, -1,
out hv_AcqHandle);
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
textBox1.Text = "相机已打开!";
}
#endregion
采集显示部分代码:
注意:如果显示的图像只是halcon中可以看到的一部分,则说明halcon中没有使用dev_set_part()函数
#region 采集显示
///
/// 此部分包含定时器的触发
///
///
///
private void button4_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
//打开窗口显示图片
HOperatorSet.OpenWindow(0, 0, hWindowControl1.Width, hWindowControl1.Height, hWindowControl1.HalconWindow, "visible", "", out hv_WindowHandle);
HDevWindowStack.Push(hv_WindowHandle);
}
private void timer1_Tick(object sender, EventArgs e)
{
ho_Timg.Dispose();
//获取图片
HOperatorSet.GrabImageAsync(out ho_Timg, hv_AcqHandle, -1);
//获取图片长宽
hv_Width.Dispose(); hv_Height.Dispose();
HOperatorSet.GetImageSize(ho_Timg, out hv_Width, out hv_Height);
//设置获取的图片在窗口中显示大小(此部分如果没有,则只能显示采集到的一部分图像)
if (HDevWindowStack.IsOpen())
{
HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);
}
//如果窗口打开,显示图片
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_Timg, HDevWindowStack.GetActive());
textBox1.Text = "实时录像成功!";
}
}
#endregion
关闭相机部分代码:
#region 关闭相机
private void button5_Click(object sender, EventArgs e)
{
//关闭定时器这步十分重要,不能少了
timer1.Enabled = false;
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Timg.Dispose();
textBox1.Text = "关闭相机成功!";
}
#endregion
Halcon与C#实时采集图像相关教程Unity与nodejs实时连接,实时音视频图像识别halcon基础应用及方法经验分享构建直播时实时音视频平台(一)实时预测用户对物品的偏好阿里云推荐引擎帮助您更好的提升业务。海量数据实时查询域名数据库设计小记(一)Spark实时e -商务数据分析与可视化HTML前端实时可视化开发工具Android平台美颜相机/相机实时滤镜/视频编解码/图片贴/人脸