海康工业相机SDK Halcon接口是比较好用, 它使得我们可以利用halcon的语法利用SDK的功能.
之前勇哥写了一篇用halcon代码演示使用方法的贴子. http://47.98.154.65/?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, 如下图所示.
如果自己指定了设备用户ID号, 就不能在使用原来的默认的串行号了, 如下图所示的00770494565将不能再使用了.
而应该使用QT6-212-C-CAM1
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


