using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Drawing;
using FlyCapture2Managed;
using System.Threading;
namespace M423project
{
///
/// 利用Flycapture库连接的相机
///
public class FlyCaptureCamera : CameraBase
{
// 摄像机序列号
public string SerialNum {get;set;}
// 抓拍或扫描到的图片
public ManagedImage Image {
get { return (ManagedImage)base.ImageObj; }
set { base.ImageObj = value; }
}
// 图片像素格式
public PixelFormat PixFormat { get; set; }
// 取景相机
protected ManagedCamera cam = null;
public double ExposureValue { get; set; }
public double GainValue { get; set; }
public FlyCaptureCamera(double _exposureValue, double _gainValue)
{
this.SerialNum = "";
this.Image = null;
ExposureValue = _exposureValue;// 4.97;
GainValue = _gainValue;// 1.9;
this.PixFormat = PixelFormat.PixelFormatMono8;
this.cam = new ManagedCamera();
}
///
/// 相机初始化
///
///
public override bool Init()
{
if (base.IsInit)
{
return true;
}
try
{
//ManagedBusManager.ForceAllIPAddressesAutomatically(Convert.ToUInt32(SerialNum));
base.Init();
}
catch (Exception e)
{
CommonUtil.WriteLog(LogType.Exc, string.Format("{0} Init fail, serialNum:{1} ex:{2}", Desp, SerialNum, e.Message));
return false;
}
return true;
}
///
/// 打开
///
///
public override bool Open()
{
if (base.IsOpen)
{
return true;
}
try
{
var busManager = new ManagedBusManager();
var guid = busManager.GetCameraFromSerialNumber(Convert.ToUInt32(SerialNum));
cam.Connect(guid);
InitParams();
SetShutter(ExposureValue);
SetGain(GainValue);
base.Open();
return true;
}
catch(Exception ex)
{
cam = null;
CommonUtil.WriteLog(LogType.Exc, string.Format("FlayCaptureCamera serialNum{0} open fail, ex:{1}", SerialNum, ex.Message));
}
return false;
}
public void SetShutter(double ShutterVal)
{
try
{
CameraProperty campara = cam.GetProperty(PropertyType.Shutter);
campara.absControl = true;
campara.autoManualMode = false;
campara.absValue = (float)ShutterVal;
cam.SetProperty(campara);
}
catch(Exception )
{
}
}
public void SetGain(double gainVal)
{
try
{
CameraProperty campara = cam.GetProperty(PropertyType.Gain);
campara.absControl = true;
campara.autoManualMode = false;
campara.absValue = (float)gainVal;
cam.SetProperty(campara);
}
catch(Exception )
{
}
}
///
/// 关闭
///
public override void Close()
{
if (!base.IsOpen)
{
return;
}
if ( null == cam )
{
return;
}
try
{
cam.Disconnect();
cam = null;
base.Close();
}
catch(Exception ex)
{
CommonUtil.WriteLog(LogType.Exc, string.Format("FlayCaptureCamera serialNum:{0} Close fail, ex:{1}", SerialNum, ex.Message));
}
}
///
/// 开始抓拍
///
public override bool Snapshot()
{
if (!base.IsOpen)
{
CommonUtil.WriteLog(LogType.Exc, string.Format("FlayCaptureCamera serialNum:{0} Snapshot fail, not open", SerialNum));
return false;
}
try
{
cam.StartCapture();
System.Threading.Thread.Sleep(20);
GrabImage();
cam.StopCapture();
return true;
}
catch(Exception ex)
{
CommonUtil.WriteLog(LogType.Exc, string.Format("FlayCaptureCamera serialNum:{0} StartCapture fail, ex:{1}", SerialNum, ex.Message));
}
return false;
}
///
/// 从摄像机抓取图像
/////
///
public void GrabImage()
{
try
{
var curImage = new ManagedImage();
var rawImage = new ManagedImage();
this.FreeImage();
// Retrieve an image
cam.RetrieveBuffer(rawImage);
// Convert the raw image
rawImage.Convert(this.PixFormat, curImage);
this.Image = curImage;
this.NotifyImageEvent();
rawImage.Dispose();
}
catch (Exception ex)
{
CommonUtil.WriteLog(LogType.Exc, string.Format("FlayCaptureCamera serialNum:{0} GrabImage fail, ex:{1}", SerialNum, ex.Message));
}
}
///
/// 释放图片数据
///
protected override void FreeImage()
{
if (null != this.Image)
{
this.Image.Dispose();
this.Image = null;
}
}
///
/// 把抓拍图片转成bitmap图片
///
///
public override Bitmap GetBitmap()
{
if (null == this.Image)
{
return null;
}
return this.Image.bitmap;
}
}
}