参考:halcon联合C#的实时采集显示/版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
环境:Win10 Halcon19_64bit VS2019
连接相机,打开新的图像采集,检测使用的接口
随便点,都可以点
点出采集窗口后点击插入代码
在基础代码上加点语句,按F5可以测试运行
不加打开图像窗口的话程序可以蠢到不显示采集,不加填充窗口的话据说分辨率比例不对的时候会显示不全,但是试了一下注释掉然后乱改窗口比例,感觉也没什么区别
参考代码,打开摄像头语句换成换成自个的,就不信还有谁有扛地铁型号的摄像头
*打开摄像头
open_framegrabber ('USB3Vision', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', '扛着地铁的都有恃无恐', 0, -1, AcqHandle)
*开始采集
grab_image_start (AcqHandle, -1)
*关闭图形窗口
dev_close_window()
*打开图像窗口
dev_open_window(0,0,512,512,'green',WindowHandle)
while (true)
*异步采集
grab_image_async (Image, AcqHandle, -1)
*显示图像
dev_display(Image)
*获取图像大小
get_image_size(Image,Width,Height)
*填充窗口
dev_set_part(0,0,Height,Width)
endwhile
*关闭摄像头
close_framegrabber (AcqHandle)
导出为C#代码
VS里新建C#项目
之前已经添加过引用所以直接从工具箱里找到Halcon控件拖进窗口
再加一个按钮,用来关闭相机,因为发现如果不关闭相机就直接关闭程序,下次打开就会出错,只能重新插拔相机并重启程序,Halcon的迷惑机制不是很懂
继续打开工具箱,找到Timer定时器拖进窗口
选择定时器,打开属性,修改时间为40ms,而且据说这种定时器控制循环的方式采集到的图像并不准确
那个Program.cs不用管,直接双击按钮控件进入Form1.cs
把导出的C#文件里的using HalconDotNet;复制到和Form1.cs里的那一堆using一起
后面的一大堆里找到action()函数
把各种定义和声明放到Form类里
把打开摄像头相关语句放进Form函数里,最后加一句启动定时器的语句
timer1.Enabled = true;
窗口初始化完成后就自动打开摄像头,参考的例子里是整了仨按钮还分打开相机和开始采集,但我嫌麻烦,直接一运行程序就开始采集摄像头又不会爆炸
把while循环里的采集语句放到定时器循环里
把关闭摄像头语句放进按钮动作里,后面加上关闭定时器的语句
然后还要修改一条语句,“将halcon窗口覆盖到WinForm界面的窗体上,找到HOperatorSet.OpenWindow修改为”:
HOperatorSet.OpenWindow(0, 0, hWindowControl1.Width, hWindowControl1.Height, hWindowControl1.HalconWindow, "visible", "", out hv_WindowHandle);
hWindowControl1是Halcon窗口控件的名称,点击拖进去的控件,打开属性窗口即可查看
进入项目属性->生成->目标平台,选择Halcon对应的平台
连接摄像头,编译运行,周围没啥好拍的干脆对准屏幕拍:
Form1.cs所有代码:
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;
using HalconDotNet;
namespace Camera_Halcon
{
public partial class Form1 : Form
{
//定义和声明
HObject ho_Image = null;
HTuple hv_AcqHandle = new HTuple(), hv_WindowHandle = new HTuple();
HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
public Form1()
{
InitializeComponent();
//打开摄像头
HOperatorSet.GenEmptyObj(out ho_Image);
hv_AcqHandle.Dispose();
HOperatorSet.OpenFramegrabber("USB3Vision", 0, 0, 0, 0, 0, 0, "progressive",
-1, "default", -1, "false", "default", "", 0,
-1, out hv_AcqHandle);
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
if (HDevWindowStack.IsOpen())
{
HOperatorSet.CloseWindow(HDevWindowStack.Pop());
}
HOperatorSet.SetWindowAttr("background_color", "green");
//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);
HDevWindowStack.Push(hv_WindowHandle);
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
//异步采集
ho_Image.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
//显示图像
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
}
//获取图像大小
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);
}
}
private void button1_Click(object sender, EventArgs e)
{
//关闭摄像头
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
timer1.Enabled = false;
}
}
}