海康工业相机SDK Halcon接口是比较好用, 它使得我们可以利用halcon的语法利用SDK的功能.
之前勇哥写了一篇用halcon代码演示使用方法的贴子. http://www.skcircle.com/?id=1427
现在写一个C#的应用类, 方便自己也方便了大家.
勇哥写了个应用类, 如下:
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,转载请注明出处!讨论可扫码加群:


