.大华相机SDK调用——主动采图、外触发、参数_昨夜雨疏风骤z的博客-CSDN博客
引入
代码
/// <summary>
/// 大华相机
/// </summary>
public class DHCamera : ICamera
{
/// <summary>
/// 相机数量
/// </summary>
private int CameraNum = -1;
/// <summary>
/// 相机设备
/// </summary>
private IDevice[] Cameras;
/// <summary>
/// 图像帧集合
/// </summary>
private List<IGrabbedRawData> rawDatas = new List<IGrabbedRawData>();
/// <summary>
/// 互斥锁
/// </summary>
private Mutex mutex = new Mutex();
/// <summary>
/// 相机数量
/// </summary>
public int CamNumber
{
get { return CameraNum; } //返回当前相机查找到的数量
}
/// <summary>
/// 关闭相机
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public bool CloseCamera(int index)
{
try
{
if (Cameras[index] == null)
{
return false;
}
Cameras[index].StreamGrabber.ImageGrabbed -= OnImageGrabbed; /* 反注册回调 */
Cameras[index].ShutdownGrab(); /* 停止码流 */
Cameras[index].Close(); /* 关闭相机 */
}
catch
{
return false;
}
return true;
}
/// <summary>
/// 查找设备
/// </summary>
/// <returns></returns>
public bool EnumCamera()
{
List<IDeviceInfo> number;
try
{
/* 设备搜索 */
number = Enumerator.EnumerateDevices();
if (number.Count > 0)
{
CameraNum = number.Count-1;
Cameras = new IDevice[CameraNum];
return true;
}
else
{
return false;
}
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// 获取曝光时间
/// </summary>
/// <param name="index"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool GetExposureTime(int index, ref double value)
{
using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.ExposureTime])
{
value=p.GetValue();
return true;
}
}
/// <summary>
/// 获取增益
/// </summary>
/// <param name="index"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool GetGian(int index, ref double value)
{
using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.GainRaw])
{
value=p.GetValue();
return true;
}
}
/// <summary>
/// 采集图像
/// </summary>
/// <param name="index"></param>
/// <param name="image"></param>
/// <returns></returns>
public bool GrabCamera(int index, out HObject image)
{
mutex.WaitOne(); //等待获取互斥锁
image = new HObject();
try
{
IGrabbedRawData frame = rawDatas.ElementAt(rawDatas.Count - 1); //取图像帧集合中的最后一帧(最新的一帧)
rawDatas.Clear(); //清除图像队列
mutex.ReleaseMutex(); //释放互斥锁
int nRGB = RGBFactory.EncodeLen(frame.Width, frame.Height, false);
IntPtr pData = Marshal.AllocHGlobal(nRGB);
Marshal.Copy(frame.Image, 0, pData, frame.ImageSize);
Marshal.FreeHGlobal(pData);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 打开相机
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public bool OpenCamera(int index)
{
#region 验证
//判断相机数量
if(CameraNum<0)
{
return false;
}
//判断输入的相机索引是否大于相机的数量
if (index > CameraNum)
{
return false;
}
#endregion
//获取当前索引相机信息
try
{
Cameras[index] = Enumerator.GetDeviceByIndex(index);
if (!Cameras[index].Open())
{
return false;
}
}
catch
{
return false;
}
/* 设置图像格式 */
using (IEnumParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.ImagePixelFormat])
{
p.SetValue("Mono8");
}
/* 设置曝光 */
using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.ExposureTime])
{
p.SetValue(1000);
}
/* 设置增益 */
using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.GainRaw])
{
p.SetValue(1.0);
}
/* 设置缓存个数为8(默认值为16) */
Cameras[index].StreamGrabber.SetBufferCount(8);
/* 开启码流 */
if (!Cameras[index].GrabUsingGrabLoopThread())
{
return false;
}
//关闭触发模式 设置为内触发采集
if (Cameras[index].TriggerSet.Close())
{
return false;
}
return true;
}
public bool SetExposureTime(int index, double value)
{
/* 设置曝光 */
using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.ExposureTime])
{
if (p.SetValue(value)) return false;
}
return true;
}
public bool SetGain(int index, double value)
{
/* 设置增益 */
using (IFloatParameter p = Cameras[index].ParameterCollection[ParametrizeNameSet.GainRaw])
{
if (p.SetValue(1.0)) return false;
return true;
}
}
/* 码流数据回调 */
private void OnImageGrabbed(Object sender, GrabbedEventArgs e)
{
mutex.WaitOne(); //等待获取互斥锁
if (rawDatas.Count >= 50) //判断当前队列中的图像超过50张 则清除队列
{
rawDatas.Clear();
}
rawDatas.Add(e.GrabResult.Clone());//获取一帧图像数据到帧集合中
mutex.ReleaseMutex();
}
}