海康工业相机SDK Halcon接口应用类

海康工业相机SDK Halcon接口是比较好用, 它使得我们可以利用halcon的语法利用SDK的功能.

之前勇哥写了一篇用halcon代码演示使用方法的贴子.  http://www.skcircle.com/?id=1427


现在写一个C#的应用类, 方便自己也方便了大家.


勇哥写了个应用类, 如下:

using HalconDotNet;
using MvCamCtrl.NET;
using netMarketing.Message;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MvsHelper
{

    public enum hikccdTriggerModeEnum
    {
        Line0 = 0, Line1, Line2, Line3, Counter, Software
    }

    /// <summary>
    /// 海康面阵相机操作类 hikccdHelper version1.0
    /// www.skcircle.com  by 刘小勇(很想停止)
    /// QQ:496103864  微信:abc496103864
    /// </summary>
    public class hikccdHelper
    {
        
        private bool grabbing;
        private HTuple AcqHandle = new HTuple();
        private HObject currentImg;
        private hikccdTriggerModeEnum triggerMode;

        public hikccdTriggerModeEnum TriggerMode
        {
            get { return triggerMode; }
            set { triggerMode = value; }
        }

        private string name;

        /// <summary>
        /// 开始采集的状态
        /// </summary>
        public bool Grabbing
        {
            get { return grabbing; }
            set { grabbing = value; }
        }

        /// <summary>
        /// 当前相机的名字
        /// </summary>
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public hikccdHelper(string ccdname)
        {
            Name = ccdname;
            currentImg = new HObject();
        }

        private bool isdebugMode=false;

        public bool IsdebugMode
        {
            get { return isdebugMode; }
            set { isdebugMode = value; }
        }

        private string localImgFilePath;

        /// <summary>
        /// 本地图片路径 
        /// </summary>
        public string LocalImgFilePath
        {
            get { return localImgFilePath; }
            set { localImgFilePath = value; }
        }
       

        /// <summary>
        /// 枚举系统已经安装的海康相机(的序列号)  异常:ArgumentException
        /// </summary>
        /// <returns>返回相机序列号列表</returns>
        public List<string> GetDeviceList()
        {
            try
            {
                var msg = string.Empty;
                var reslist = new List<string>();

                // ch:创建设备列表
                System.GC.Collect();
                HTuple info = new HTuple();
                HTuple cameras = new HTuple();
                info.Dispose(); cameras.Dispose();
                HOperatorSet.InfoFramegrabber("HMV3rdParty", "device", out info, out cameras);
                reslist = cameras.SArr.ToList();
                return reslist;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        
        /// <summary>
        /// 打开指定的相机(按序列号) 异常:ArgumentException
        /// </summary>
        /// <param name="serialNum"></param>
        public void OpenCCD(string serialNum)
        {
            var msg = string.Empty;
            if (isdebugMode)
            {
                try
                {
                    HOperatorSet.OpenFramegrabber(
                    "File", 1, 1, 0, 0, 0, 0, "default",
                        -1, "default", -1, "false", localImgFilePath, "default", 1, -1, out AcqHandle);
                }
                catch (Exception ex)
                {
                    if (ex.Message.IndexOf("5200") > 0)
                        throw new ArgumentException("顶相机在调试模式下要指定调试图像文件!");
                    else
                        throw ex;
                }
            }
            else
            {
                try
                {
                    msg = string.Empty;
                    HOperatorSet.OpenFramegrabber("HMV3rdParty", 0, 0, 0, 0, 0, 0, "progressive",
                        -1, "default", -1, "false", "default", serialNum, 0, -1, out AcqHandle);
                }
                catch (Exception ex)
                {
                    msg = string.Format("serialNum[{0}] not exist! {1}", serialNum, ex.Message);
                    NotifyG.Error(msg);
                    throw new ArgumentException(msg);
                }
            }
            
        }

        /// <summary>
        /// 设置外部硬件触发为Line0模式,读取图片请用函数:GrabImgFromLine0()   异常:ArgumentException
        /// </summary>
       public void SetLine0Trigger()
        {
            try
            {
                HOperatorSet.SetFramegrabberParam(AcqHandle, "TriggerMode", "On");
                HOperatorSet.SetFramegrabberParam(AcqHandle, "TriggerSource", "Line0");
                //设置取图超时时间为-1(永久等待)
                HOperatorSet.SetFramegrabberParam(AcqHandle, "grab_timeout", -1);
                //开始异步取流
                HOperatorSet.GrabImageStart(AcqHandle, -1);
            }
           catch(Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
       /// Line0外部触发取一张图片    异常:ArgumentException
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public HObject GrabImgFromLine0()
        {
            try
            {
                HObject image = new HObject();
                image.Dispose();
                HOperatorSet.GrabImageAsync(out image, AcqHandle, -1);
                return image;
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }



        /// <summary>
        /// 关闭相机
        /// </summary>
        public void CloseCCD()
        {
            try
            {
                HOperatorSet.CloseFramegrabber(AcqHandle);
                grabbing = false;
            }
            catch(Exception ex)
            {
                grabbing = false;
                throw ex;
            }
           
        }

        /// <summary>
        /// 拍一张图,同步读取结果(带图片文件名则读取本地图片)  异常:Exception
        /// </summary>
        /// <returns></returns>
        public HObject GrabImage(string imgFile="")
        {

            Stopwatch sw1 = new Stopwatch();
            if (imgFile.Length < 1)
            {
                try
                {
                    currentImg.Dispose();
                    HOperatorSet.SetFramegrabberParam(AcqHandle, "TriggerMode", "Off");
                    HOperatorSet.GrabImage(out currentImg, AcqHandle);
                    return currentImg;
                }
                catch(Exception ex)
                {
                    throw ex;
                }
            }
            else
            {
                //脱机拍图,即读取本地图片
                try
                {
                    HObject img = new HObject();
                    img.Dispose();
                    HOperatorSet.ReadImage(out img, imgFile);
                    return img;
                }
                catch(Exception ex)
                {
                    throw new ArgumentException("GrabImage(): 传入的图片文件不存在!"+ex.Message);
                }
            }
        }

    }
}


几点说明:


我们知道, 海康的每个相机都有一个唯一的串行号,例如00770494565

要注意的是,在IP配置工具中,你可以自己指定用户ID, 如下图所示.

image.png

如果自己指定了设备用户ID号, 就不能在使用原来的默认的串行号了, 如下图所示的00770494565将不能再使用了.

而应该使用QT6-212-C-CAM1

image.png




本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864