Halcon摄像头采集导出为C#到VS2019

参考: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;
        }
    }
}

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值