using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using HalconDotNet;
using FlyCapture2Managed;
namespace PointGreyAndHalcon
{
public delegate void GrabImageDoneDelegate(string recData,HImage recImage);
public class PointGreyAndHalcon
{
#region 定义
ManagedBusManager busMgr = new ManagedBusManager();
//CameraInfo[] camInfos = ManagedBusManager.DiscoverGigECameras();
int camNum;
ManagedPGRGuid guid;
ManagedGigECamera cam;
public HImage image = new HImage();
public event GrabImageDoneDelegate GrabImageDone;
public string SerialNo;
HImage tmpImage = new HImage();
bool isCameraOpen = false;
//bool isRightCameraOpen = false;
#endregion
public PointGreyAndHalcon()
{
//camNum = camInfos.Length;
}
///
/// 打开相机
///
/// 编号
public void OpenCamera(int index)
{
try
{
guid = busMgr.GetCameraFromIndex((uint)index);
cam = new ManagedGigECamera();
cam.Connect(guid);
cam.StartCapture();
isCameraOpen = true;
}
catch (Exception ex)
{
MessageBox.Show("相机" + index.ToString() + "打开失败");
}
}
///
/// 打开相机
///
/// 序列号
public bool OpenCamera(uint serialnumber)
{
try
{
guid = busMgr.GetCameraFromSerialNumber(serialnumber);
cam = new ManagedGigECamera();
cam.Connect(guid);
cam.WriteRegister(0x610,0x00000000);//控制相机上电
System.Threading.Thread.Sleep(100);
cam.WriteRegister(0x610, 0x80000000);//控制相机下电
cam.StartCapture();
return true;
}
catch (Exception ex)
{
MessageBox.Show("相机" + serialnumber.ToString() + "打开失败");
return false;
}
}
/////
///// 打开相机
/////
///// 序列号
//public void OpenCamera_test(uint serialnumber)
//{
// try
// {
// guid = busMgr.GetCameraFromSerialNumber(serialnumber);
// cam = new ManagedGigECamera();
// cam.Connect(guid);
// cam.StartCapture(Test);
// }
// catch (Exception ex)
// {
// MessageBox.Show("相机" + serialnumber.ToString() + "打开失败");
// }
//}
private void Test(ManagedImage image)
{
lock (GetMutexLock())
{
SerialNo = "";
try
{
//ManagedImage rawImage = new ManagedImage();
// Retrieve an image
//cam.RetrieveBuffer(rawImage);
// Create a converted image
ManagedImage convertedImage = new ManagedImage();
// Convert the raw image
image.Convert(FlyCapture2Managed.PixelFormat.PixelFormatMono8, convertedImage);
//converterImage to HImage
Bitmap tmpBmp = convertedImage.bitmap;
BitmapData tmpBitmapData = tmpBmp.LockBits(new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height), ImageLockMode.ReadOnly,
System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
tmpImage.GenImage1("byte", tmpBmp.Width, tmpBmp.Height, tmpBitmapData.Scan0);
if (GrabImageDone != null)
{
GrabImageDone("GrabSuccess", tmpImage);
}
tmpBmp.UnlockBits(tmpBitmapData);
image.Dispose();
convertedImage.Dispose();
tmpBmp.Dispose();
}
catch (Exception ex)
{
if (GrabImageDone != null)
{
GrabImageDone("GrabFail", tmpImage);
}
}
}
}
///
/// 关闭相机
///
public void CloseCamera()
{
cam.StopCapture();
}
///
/// 采图
///
public void GrabImage(string sn)
{
lock (GetMutexLock())
{
SerialNo = sn;
try
{
ManagedImage rawImage = new ManagedImage();
// Retrieve an image
cam.RetrieveBuffer(rawImage);
// Create a converted image
ManagedImage convertedImage = new ManagedImage();
// Convert the raw image
rawImage.Convert(FlyCapture2Managed.PixelFormat.PixelFormatMono8, convertedImage);
//converterImage to HImage
Bitmap tmpBmp = convertedImage.bitmap;
BitmapData tmpBitmapData = tmpBmp.LockBits(new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height), ImageLockMode.ReadOnly,
System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
tmpImage.GenImage1("byte", tmpBmp.Width, tmpBmp.Height, tmpBitmapData.Scan0);
image.Dispose();
image = tmpImage.CopyImage();
if (GrabImageDone != null)
{
GrabImageDone("GrabSuccess", tmpImage);
}
tmpBmp.UnlockBits(tmpBitmapData);
rawImage.Dispose();
convertedImage.Dispose();
tmpBmp.Dispose();
}
catch (Exception ex)
{
if (GrabImageDone != null)
{
GrabImageDone("GrabFail", tmpImage);
}
}
}
}
///
/// 采彩色图
///
public void GrabColorImage(string sn)
{
SerialNo = sn;
try
{
ManagedImage rawImage = new ManagedImage();
// Retrieve an image
cam.RetrieveBuffer(rawImage);
// Create a converted image
ManagedImage convertedImage = new ManagedImage();
// Convert the raw image
rawImage.Convert(FlyCapture2Managed.PixelFormat.PixelFormatBgr, convertedImage);
//converterImage to HImage
Bitmap tmpBmp = convertedImage.bitmap;
Rectangle rect = new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height);
BitmapData tmpBitmapData = tmpBmp.LockBits(rect, ImageLockMode.ReadOnly,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
#region 将RGB分离开来
//创建新的彩色的bitmap
Bitmap redBitmap = new Bitmap(tmpBmp.Width, tmpBmp.Height);
Bitmap greenBitmap = new Bitmap(tmpBmp.Width, tmpBmp.Height);
Bitmap blueBitmap = new Bitmap(tmpBmp.Width, tmpBmp.Height);
//创建新的彩色的数据容器
BitmapData redBmData = redBitmap.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
BitmapData greenBmData = greenBitmap.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
BitmapData blueBmData = blueBitmap.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
//将Bitmap对象的信息存放到byte数组中
int tmp_bytes = tmpBitmapData.Stride * tmpBmp.Height;
int red_bytes = redBmData.Stride * tmpBmp.Height;
int green_bytes = greenBmData.Stride * tmpBmp.Height;
int blue_bytes = blueBmData.Stride * tmpBmp.Height;
byte[] tmpValues = new byte[tmp_bytes];
byte[] redValues = new byte[red_bytes];
byte[] greenValues = new byte[green_bytes];
byte[] blueValues = new byte[blue_bytes];
//复制GRB信息到byte数组
System.Runtime.InteropServices.Marshal.Copy(tmpBitmapData.Scan0, tmpValues, 0, tmp_bytes);
System.Runtime.InteropServices.Marshal.Copy(redBmData.Scan0, redValues, 0, red_bytes);
System.Runtime.InteropServices.Marshal.Copy(greenBmData.Scan0, greenValues, 0, green_bytes);
System.Runtime.InteropServices.Marshal.Copy(blueBmData.Scan0, blueValues, 0, blue_bytes);
//将彩色信息分别存储到RGB数组中
for (int i = 0; i < tmpBmp.Height; i++)
{
for (int j = 0; j < tmpBmp.Width; j++)
{
int k = 3 * j;
redValues[i * redBmData.Stride + j] = tmpValues[i * tmpBitmapData.Stride + k + 2];
greenValues[i * blueBmData.Stride + j] = tmpValues[i * tmpBitmapData.Stride + k + 1];
blueValues[i * greenBmData.Stride + j] = tmpValues[i * tmpBitmapData.Stride + k];
}
}
//再将数组信息复制到RGB
System.Runtime.InteropServices.Marshal.Copy(redValues, 0, redBmData.Scan0, red_bytes);
System.Runtime.InteropServices.Marshal.Copy(greenValues, 0, greenBmData.Scan0, green_bytes);
System.Runtime.InteropServices.Marshal.Copy(blueValues, 0, blueBmData.Scan0, blue_bytes);
#endregion
tmpImage.GenImage3("byte", tmpBmp.Width, tmpBmp.Height, redBmData.Scan0, greenBmData.Scan0, blueBmData.Scan0);
if (GrabImageDone != null)
{
GrabImageDone("GrabSuccess", tmpImage);
}
tmpBmp.UnlockBits(tmpBitmapData);
redBitmap.UnlockBits(redBmData);
greenBitmap.UnlockBits(greenBmData);
blueBitmap.UnlockBits(blueBmData);
rawImage.Dispose();
convertedImage.Dispose();
tmpBmp.Dispose();
redBitmap.Dispose();
greenBitmap.Dispose();
blueBitmap.Dispose();
}
catch (Exception ex)
{
if (GrabImageDone != null)
{
GrabImageDone("GrabFail", tmpImage);
}
}
}
///
/// 将图片显示到图相框中
///
public void UpdateImage(HWindowControl viewPort)
{
HWndCtrl viewController = new HWndCtrl(viewPort);
ROIController roiController = new ROIController();
viewController.resetAll();
viewController.useROIController(roiController);
viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
viewController.addIconicVar(image);
viewController.repaint();
//image.Dispose();
}
///
/// 保存图片
///
///
///
public void SaveImage(string filePath, string fileName)
{
image.WriteImage("tiff", 0, filePath + "\\" + fileName);
}
public void SetExposure(float exposure)
{
CameraProperty cp = cam.GetProperty(PropertyType.Shutter);
cp.absValue = exposure;
cp.autoManualMode = false;
cam.SetProperty(cp);
}
private static System.Threading.Mutex _mutex;
private System.Threading.Mutex GetMutexLock()
{
System.Threading.Interlocked.CompareExchange(ref _mutex, new System.Threading.Mutex(), null);
return _mutex;
}
}
}