using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using HalconDotNet;
|
using System.Drawing;
|
using System.Drawing.Imaging;
|
using FlyCapture2Managed;
|
using System.Threading;
|
using System.Net;
|
using System.Net.NetworkInformation;
|
using System.Configuration;
|
|
|
namespace M423project
|
{
|
/// <summary>
|
///图象处理类
|
/// </summary>
|
public class ImageProcess
|
{
|
private object _barcodeLockObj = new object();
|
private object _sizeLockObj = new object();
|
private string GocatorIPAddress = "192.168.1.10";
|
private string UploadCameraSerialNum = "16511960";
|
private string BarcodeCameraSerialNum = "706359";
|
private string SizeCameraSerialNum = "1399882";
|
private HTuple acqHandleMessageZ;
|
|
private FlyCaptureCamera flyCameraProductNo;
|
private FlyCaptureCamera flyCameraXY;
|
private Queue<HImage> barcodeImageList = new Queue<HImage>();
|
private Queue<HImage> sizeImageList = new Queue<HImage>();
|
//
|
private double BarcodeCameraExposure = 12;
|
private double BarcodeCameraGain = 2.5;
|
|
private double SizeCameraExposure = 12;
|
private double SizeCameraGain = 2.5;
|
|
private double SizeCameraExposureStandard;
|
private double SizeCameraGainStandard;
|
|
private PhysicalAddress ProductNoCameraMACAddress { get; set; }
|
private IPAddress ProductNoCameraIPAddress { get; set; }
|
private IPAddress ProductNoCameraSubnetMask { get; set; }
|
private IPAddress ProductNoCameraDefaultGateway { get; set; }
|
|
private PhysicalAddress SizeCameraMACAddress { get; set; }
|
private IPAddress SizeCameraIPAddress { get; set; }
|
private IPAddress SizeCameraSubnetMask { get; set; }
|
private IPAddress SizeCameraDefaultGateway { get; set; }
|
|
|
public ImageProcess()
|
{
|
GocatorIPAddress = ConfigurationManager.AppSettings["GocatorIPAddress"];
|
UploadCameraSerialNum = ConfigurationManager.AppSettings["UploadCameraSerialNum"];
|
BarcodeCameraSerialNum = ConfigurationManager.AppSettings["BarcodeCameraSerialNum"];
|
SizeCameraSerialNum = ConfigurationManager.AppSettings["SizeCameraSerialNum"];
|
double d = 0;
|
if (double.TryParse(ConfigurationManager.AppSettings["BarcodeCameraExposure"], out d))
|
BarcodeCameraExposure = d;
|
|
if (double.TryParse(ConfigurationManager.AppSettings["BarcodeCameraGain"], out d))
|
BarcodeCameraGain = d;
|
|
if (double.TryParse(ConfigurationManager.AppSettings["SizeCameraExposure"], out d))
|
SizeCameraExposure = d;
|
|
if (double.TryParse(ConfigurationManager.AppSettings["SizeCameraGain"], out d))
|
SizeCameraGain = d;
|
|
if (double.TryParse(ConfigurationManager.AppSettings["SizeCameraExposureStandard"], out d))
|
SizeCameraExposureStandard = d;
|
|
if (double.TryParse(ConfigurationManager.AppSettings["SizeCameraGainStandard"], out d))
|
SizeCameraGainStandard = d;
|
|
/*
|
ProductNoCameraMACAddress = PhysicalAddress.Parse(ConfigurationManager.AppSettings["ProductNoCameraMACAddress"]);
|
ProductNoCameraIPAddress = IPAddress.Parse(ConfigurationManager.AppSettings["ProductNoCameraIPAddress"]);
|
ProductNoCameraSubnetMask = IPAddress.Parse(ConfigurationManager.AppSettings["ProductNoCameraSubnetMask"]);
|
ProductNoCameraDefaultGateway = IPAddress.Parse(ConfigurationManager.AppSettings["ProductNoCameraDefaultGateway"]);
|
|
SizeCameraMACAddress = PhysicalAddress.Parse(ConfigurationManager.AppSettings["SizeCameraMACAddress"]);
|
SizeCameraIPAddress = IPAddress.Parse(ConfigurationManager.AppSettings["SizeCameraIPAddress"]);
|
SizeCameraSubnetMask = IPAddress.Parse(ConfigurationManager.AppSettings["SizeCameraSubnetMask"]);
|
SizeCameraDefaultGateway = IPAddress.Parse(ConfigurationManager.AppSettings["SizeCameraDefaultGateway"]);
|
*/
|
}
|
|
public void EnqueueBarcodeImage(HImage hImage)
|
{
|
lock (_barcodeLockObj)
|
{
|
barcodeImageList.Enqueue(hImage);
|
}
|
}
|
|
public HImage DequeueBarcodeImage()
|
{
|
lock (_barcodeLockObj)
|
{
|
if (barcodeImageList.Count > 0)
|
return (HImage)barcodeImageList.Dequeue();
|
return null;
|
}
|
}
|
|
public int BarcodeImageCount
|
{
|
get
|
{
|
lock (_barcodeLockObj)
|
{
|
return barcodeImageList.Count;
|
}
|
}
|
}
|
|
public void ClearBarcodeImage()
|
{
|
lock (_barcodeLockObj)
|
{
|
HImage hi;
|
while (barcodeImageList.Count > 0)
|
{
|
hi = (HImage)barcodeImageList.Dequeue();
|
hi.Dispose();
|
}
|
barcodeImageList.Clear();
|
}
|
}
|
|
public void EnqueueSizeImage(HImage hImage)
|
{
|
lock (_sizeLockObj)
|
{
|
sizeImageList.Enqueue(hImage);
|
}
|
}
|
|
public HImage DequeueSizeImage()
|
{
|
lock (_sizeLockObj)
|
{
|
if (sizeImageList.Count > 0)
|
return (HImage)sizeImageList.Dequeue();
|
return null;
|
}
|
}
|
|
public int SizeImageCount
|
{
|
get
|
{
|
lock (_sizeLockObj)
|
{
|
return sizeImageList.Count;
|
}
|
}
|
}
|
|
public void ClearSizeImage()
|
{
|
lock (_sizeLockObj)
|
{
|
HImage hi;
|
while (sizeImageList.Count > 0)
|
{
|
hi = (HImage)sizeImageList.Dequeue();
|
hi.Dispose();
|
}
|
sizeImageList.Clear();
|
}
|
}
|
|
public bool OpenBarcodeCamera()
|
{
|
try
|
{
|
flyCameraProductNo = new FlyCaptureCamera(BarcodeCameraExposure, BarcodeCameraGain);
|
flyCameraProductNo.SerialNum = BarcodeCameraSerialNum;
|
flyCameraProductNo.ImageEvent += BarcodeImageCaptured;
|
flyCameraProductNo.Init();
|
if (flyCameraProductNo.Open())
|
return true;
|
}
|
catch (Exception)
|
{ }
|
CommonUtil.WriteLog(LogType.Inf, "产品条码相机开启失败");
|
return false;
|
}
|
|
public bool OpenSizeCamera(bool doProduct)
|
{
|
try
|
{
|
flyCameraXY = new FlyCaptureCamera(doProduct ? SizeCameraExposure : SizeCameraExposureStandard, doProduct ? SizeCameraGain : SizeCameraGainStandard);
|
flyCameraXY.SerialNum = SizeCameraSerialNum;
|
flyCameraXY.ImageEvent += SizeImageCaptured;
|
flyCameraXY.Init();
|
if (flyCameraXY.Open())
|
return true;
|
}
|
catch (Exception)
|
{ }
|
CommonUtil.WriteLog(LogType.Inf, "产品尺寸相机开启失败");
|
return false;
|
}
|
|
public bool OpenHeightCamera()
|
{
|
if (!TryConnectGocator())
|
{
|
CommonUtil.WriteLog(LogType.Inf, "产品高度相机开启失败");
|
return false;
|
}
|
try
|
{
|
HOperatorSet.OpenFramegrabber("GenICamTL", 0, 0, 0, 0, 0, 0, "progressive", -1, "default", -1, "false", "default", GocatorIPAddress, 0, -1, out acqHandleMessageZ);
|
|
#region 添加Gocator采图超时设置
|
HOperatorSet.SetFramegrabberParam(acqHandleMessageZ, "grab_timeout", 1000);
|
#endregion
|
|
//HOperatorSet.OpenFramegrabber("GenICamTL", 0, 0, 0, 0, 0, 0, "progressive", -1, "default", -1, "false", "default", @"192.168.1.10 producer:C:\Gocator4.5.4.120GenTL\x86\Go2GenTL.cti interface:0:XX::GenTL vendor:LMI model:Gocator 2320", 0, -1, out acqHandleMessageZ);
|
// 'GenICamTL', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', '192.168.1.10 producer:C:\\GenTL\\x86\\Go2GenTL.cti interface:0:XX::GenTL vendor:LMI model:Gocator', 0, -1, AcqHandle)
|
HOperatorSet.GrabImageStart(acqHandleMessageZ, -1);
|
return true;
|
}
|
catch (Exception e)
|
{
|
CommonUtil.WriteLog(LogType.Inf, string.Format("Gocator开启失败: {0}", e.Message));
|
}
|
CommonUtil.WriteLog(LogType.Inf, "产品高度相机开启失败");
|
return false;
|
}
|
|
public void CloseBarcodeCamera()
|
{
|
flyCameraProductNo.Close();
|
flyCameraProductNo = null;
|
}
|
|
public void CloseSizeCamera()
|
{
|
flyCameraXY.ImageEvent -= SizeImageCaptured;
|
flyCameraXY.Close();
|
|
flyCameraXY = null;
|
|
GC.Collect();
|
}
|
|
public void CloseHeightCamera()
|
{
|
HOperatorSet.CloseAllFramegrabbers();
|
}
|
|
//开启相机
|
public bool OpenCameras()
|
{
|
CommonUtil.WriteLog(LogType.Inf, "开启相机...");
|
|
if (!OpenHeightCamera())
|
return false;
|
if (!OpenBarcodeCamera())
|
return false;
|
|
if (!OpenSizeCamera(true))
|
return false;
|
|
CommonUtil.WriteLog(LogType.Inf, "所有相机已开启");
|
return true;
|
}
|
|
//开启GrayPoint相机
|
public bool OpenGrayPointCameras()
|
{
|
CommonUtil.WriteLog(LogType.Inf, "开启GrayPoint相机...");
|
try
|
{
|
if (!OpenBarcodeCamera())
|
return false;
|
|
if (!OpenSizeCamera(true))
|
return false;
|
CommonUtil.WriteLog(LogType.Inf, "所有GrayPoint相机已开启");
|
return true;
|
|
}
|
catch (Exception)
|
{
|
return false;
|
}
|
}
|
|
//关闭相机
|
public void CloseCameras()
|
{
|
try
|
{
|
CloseSizeCamera();
|
CloseBarcodeCamera();
|
CloseHeightCamera();
|
|
GC.Collect();
|
}
|
catch (Exception ee)
|
{
|
CommonUtil.WriteLog(LogType.Err, string.Format("关闭相机出错:{0}", ee.Message));
|
}
|
}
|
|
//关闭GrayPoint相机
|
public void CloseGrayPointCameras()
|
{
|
try
|
{
|
CloseSizeCamera();
|
CloseBarcodeCamera();
|
|
GC.Collect();
|
}
|
catch (Exception ee)
|
{
|
CommonUtil.WriteLog(LogType.Err, string.Format("关闭GrayPoint相机出错:{0}", ee.Message));
|
}
|
}
|
|
public void BarcodeImageCaptured(object image)
|
{
|
ManagedImage mi = (ManagedImage)image;
|
Bitmap bmp = null;
|
BitmapData bmpData = null;
|
try
|
{
|
bmp = (Bitmap)mi.bitmap;
|
|
HImage curImage = new HImage();
|
bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
|
curImage.GenImageInterleaved(bmpData.Scan0, "bgr", bmp.Width, bmp.Height, -1, "byte", bmp.Width, bmp.Height, 0, 0, -1, 0);
|
|
lock (_barcodeLockObj)
|
{
|
barcodeImageList.Enqueue(curImage);
|
}
|
}
|
finally
|
{
|
bmp?.UnlockBits(bmpData);
|
bmp?.Dispose();
|
bmp = null;
|
mi.Dispose();
|
GC.Collect();
|
}
|
}
|
|
public void SizeImageCaptured(object image)
|
{
|
ManagedImage mi = (ManagedImage)image;
|
Bitmap bmp = null;
|
BitmapData bmpData = null;
|
|
try
|
{
|
bmp = (Bitmap)mi.bitmap;
|
|
HImage curImage = new HImage();
|
bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
|
|
curImage.GenImageInterleaved(bmpData.Scan0, "bgr", bmp.Width, bmp.Height, -1, "byte", bmp.Width, bmp.Height, 0, 0, -1, 0);
|
|
lock (_barcodeLockObj)
|
{
|
sizeImageList.Enqueue(curImage);
|
}
|
}
|
catch (Exception ex) { }
|
finally
|
{
|
bmp?.UnlockBits(bmpData);
|
bmp?.Dispose();
|
bmp = null;
|
mi.Dispose();
|
GC.Collect();
|
}
|
}
|
|
|
//抓取产品编码图象
|
public void GrapProductNoAsync()
|
{
|
flyCameraProductNo.Snapshot();
|
}
|
|
//抓取产品尺寸图象
|
public void GrapSizeAsync()
|
{
|
flyCameraXY.Snapshot();
|
}
|
|
|
//获取图象特定区域
|
public void GetImageIntrest(HObject OriImage, out HObject IntrestImage)
|
{
|
HTuple RectRow1 = new HTuple(), RectColumn1 = new HTuple(), RectRow2 = new HTuple(), RectColumn2 = new HTuple();
|
HObject ROI = new HObject();
|
HOperatorSet.GenEmptyObj(out IntrestImage);
|
RectRow1 = 300;
|
RectColumn1 = 5.5;
|
RectRow2 = 750.5;
|
RectColumn2 = 1500;
|
ROI.Dispose();
|
HOperatorSet.GenRectangle1(out ROI, RectRow1, RectColumn1, RectRow2, RectColumn2);
|
IntrestImage.Dispose();
|
HOperatorSet.ReduceDomain(OriImage, ROI, out IntrestImage);
|
}
|
public bool GrapHeightImage(ref HObject hImage)
|
{
|
if (hImage != null)
|
hImage.Dispose();
|
|
try
|
{
|
VisionDetect.GrabImageAsync(acqHandleMessageZ, -1, out hImage);
|
if (hImage != null)
|
return true;
|
}
|
catch (Exception e)
|
{
|
CommonUtil.WriteLog(LogType.Exc, string.Format("Gocator 抓取图像出现异常:{0}", e.Message));
|
//CloseHeightCamera();
|
//OpenHeightCamera();
|
return false;
|
}
|
|
/*
|
Thread.Sleep(2000);
|
if (OpenHeightCamera())
|
{
|
try
|
{
|
VisionDetect.GrabImageAsync(acqHandleMessageZ, -1, out hImage);
|
if (hImage != null)
|
return true;
|
}
|
catch (Exception e)
|
{
|
CommonUtil.WriteLog(LogType.Exc, string.Format("Gocator 抓取图像出现异常:{0}", e.Message));
|
}
|
}*/
|
return false;
|
}
|
|
public bool TryConnectGocator()
|
{
|
return true;
|
//int times = 1;
|
//bool result = false;
|
//while (times <= 1 && !result)
|
//{
|
// string uri = @"http://192.168.1.10";
|
// try
|
// {
|
// HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
|
// request.Method = "GET"; //请求方法
|
// request.ProtocolVersion = new Version(1, 1); //Http/1.1版本
|
// request.Timeout = 1000 * 5;
|
// HttpWebResponse response = request.GetResponse() as HttpWebResponse;
|
// CommonUtil.WriteLog(LogType.Err, string.Format("第{0}次尝试连接Gocator成功", times));
|
// result = true;
|
// }
|
// catch (Exception e)
|
// {
|
// CommonUtil.WriteLog(LogType.Err, string.Format("第{0}次尝试连接Gocator失败:{1}", times, e.Message));
|
// Thread.Sleep(500);
|
// }
|
// times++;
|
//}
|
//return result;
|
}
|
}
|
}
|