ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

大华相机(华睿科技)SDK取像(halcon版)

2022-02-26 15:33:03  阅读:897  来源: 互联网

标签:sender void dev halcon private 华睿 using 取像 public


根据官方demo修改出来的类

 public class DaHuaCam
    {
        List<IGrabbedRawData> m_frameList;        // 图像缓存列表 | frame data list 
        Mutex m_mutex = new Mutex();        // 锁,保证多线程安全 | mutex 
        private IDevice m_dev;
        List<IDeviceInfo> li;
        public delegate void ImageEventHandler(object sender, ImageEventArgs e);
        public event ImageEventHandler ImageEvent;

        public DaHuaCam()
        {
            m_frameList = new List<IGrabbedRawData>();
            li = Enumerator.EnumerateDevices();
        }

        protected void OnImageEvent(HObject image8Grey)
        {
            ImageEventArgs imageEventargs = new ImageEventArgs(image8Grey);
            ImageEvent?.Invoke(this, imageEventargs);
        }

        /// <summary>
        /// 打开相机
        /// </summary>
        /// <param name="index"></param>
        public void OpenCamera(int index)
        {
            if (li.Count > 0)
            {
                m_dev = Enumerator.GetDeviceByIndex(index);
            }

            if (m_dev == null)
            {
                return;
            }

            m_dev.CameraOpened += OnCameraOpen;
            m_dev.ConnectionLost += OnConnectLoss;
            m_dev.CameraClosed += OnCameraClose;

            // 打开设备 ,调用Open方法打开相机
            // open device 
            if (!m_dev.Open())
            {
                MessageBox.Show("Open camera failed");
                return;
            }

            // 设置缓存个数为8(默认值为16) 
            m_dev.StreamGrabber.SetBufferCount(8);

            //注册相机取流回调事件
            m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed;

        }

        /// <summary>
        /// 是否开启触发模式
        /// </summary>
        /// <param name="fON">true为外触发,false为实时状态</param>
        public void SetTrigger(bool fON)
        {
            if (fON)
            {
                //Open为开启触发模式,设置Line1时,triggermode自动改为On,不用手动写入
                m_dev.TriggerSet.Open(TriggerSourceEnum.Line1);
            }
            else
            {
                //Close为关闭触发模式,此时,triggermode被改为Off
                m_dev.TriggerSet.Close();
            }
        }

        /// <summary>
        /// 设置相机曝光
        /// </summary>
        /// <param name="exposuretime"></param>
        public void SetExposureTime(int exposuretime)
        {
            using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
            {
                p.SetValue(exposuretime);
            }
        }

        /// <summary>
        /// 设置相机增益
        /// </summary>
        /// <param name="gain"></param>
        public void SetGain(double gain)
        {
            using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw])
            {
                p.SetValue(gain);
            }
        }

        /// <summary>
        /// 开始取流
        /// </summary>
        public void StartGrabImage()
        {
            if (m_dev == null)
            {
                throw new InvalidOperationException("Start Grab faild");
            }
            else
                m_dev.StreamGrabber.Start();
        }

        /// <summary>
        /// 停止取流
        /// </summary>
        public void StopGrabImage()
        {
            try
            {
                if (m_dev == null)
                {
                    throw new InvalidOperationException("Device is invalid");
                }
                else
                    m_dev.StreamGrabber.Stop();
            }
            catch (Exception exception)
            {
                Catcher.Show(exception);
            }
        }

        /// <summary>
        /// 释放相机
        /// </summary>
        public void ReleaseCamera()
        {
            try
            {
                if (m_dev == null)
                {
                    throw new InvalidOperationException("Device is invalid");
                }

                m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed;  // 反注册回调 | unregister grab event callback 
                m_dev.ShutdownGrab(); // 停止码流 | stop grabbing 
                m_dev.Close();  // 关闭相机 | close camera 
            }
            catch (Exception ex)
            {
                Catcher.Show(ex);
            }
        }

        // 相机打开回调 
        // camera open event callback 
        private void OnCameraOpen(object sender, EventArgs e)
        {

        }

        // 相机关闭回调 
        // camera close event callback 
        private void OnCameraClose(object sender, EventArgs e)
        {

        }

        private void OnConnectLoss(object sender, EventArgs e)
        {
            m_dev.ShutdownGrab();
            m_dev.Dispose();
            m_dev = null;
        }

        // 码流数据回调 
        // grab callback function 
        private void OnImageGrabbed(Object sender, GrabbedEventArgs e)
        {
            m_mutex.WaitOne();
            m_frameList.Add(e.GrabResult.Clone());
            m_mutex.ReleaseMutex();


            if (m_frameList.Count == 0)
            {
                Thread.Sleep(10);
                return;
            }

            // 图像队列取最新帧 
            // always get the latest frame in list 
            m_mutex.WaitOne();
            IGrabbedRawData frame = m_frameList.ElementAt(m_frameList.Count - 1);
            m_frameList.Clear();
            m_mutex.ReleaseMutex();

            // 主动调用回收垃圾 
            // call garbage collection 
            GC.Collect();

            HObject himg;

            try
            {
                // 图像转码成bitmap图像 
                // raw frame data converted to bitmap 
                var bitmap = frame.ToBitmap(false);

                Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);

                BitmapData srcBmpData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);

                //bitmap转halcon
                HOperatorSet.GenImage1(out himg, "byte", bitmap.Width, bitmap.Height, srcBmpData.Scan0);

                //用事件传出,用于外部使用
                OnImageEvent(himg);

                himg.Dispose();

            }
            catch (Exception exception)
            {
                Catcher.Show(exception);
            }
        }
    }

    public class ImageEventArgs
    {
        public HObject image;
        public ImageEventArgs(HObject img)
        {
            image = img;
        }
    }

winform用法

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ThridLibray;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        DaHuaCam cam0 = new DaHuaCam();

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;

            cam0.ImageEvent += Cam0_ImageEvent;

            cam0.OpenCamera(0);

            cam0.SetTrigger(true);

            cam0.SetExposureTime(10000);
            cam0.SetGain(5);
        }

        private void Cam0_ImageEvent(object sender, ImageEventArgs e)
        {
            hWindowControl1.HalconWindow.DispObj(e.image);
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            cam0.StartGrabImage();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            cam0.StopGrabImage();

        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            cam0.ReleaseCamera();
        }
    }
}

界面

标签:sender,void,dev,halcon,private,华睿,using,取像,public
来源: https://www.cnblogs.com/yuanqi99977/p/15939391.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有