勇哥手上有几个案子用到了海康工业相机,为了方便自己,简单写了一个操作类。
目前初步出了一个v1.0,功能围绕项目需要,因此十分简单,暂支持下面的内容:
连续触发和外部信号触发
外部触发时的软件触发模式
枚举设备列表
可以看到连断线重连都没做。
先放上来吧,以后会持续完善它,并收录到netMarketing类库。
对于怎么接外部触发信号,请参考下面的贴子:
演示程序如下:
其实我就是拷贝的官方程序的界面,各位正好看看有了操作类,相对于原例程来讲是大大的简化了编程。
简单说说用法:
如果你想得到连续拍图的效果,则勾选连续模式->开始采集
如果你想简单拍次一次图片,不用硬件触发,则勾选触发模式->开始采庥->勾选软触发->软触发一次
如果你想硬件触发一次,则勾选触发模式->开始采集->然后用的你的plc或者其它输出IO之类的硬件out一次
操作类的使用示例:
唯一要说明的是,你得在UI线程中注册一个OutImgEvent事件,以获取拍到的图片。
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MvsHelper
{
public partial class Form1 : Form
{
hikccdHelper ccd;
HWindow m_Window;
public Form1()
{
InitializeComponent();
ccd = new hikccdHelper("测试相机A");
m_Window = new HWindow();
DisplayWindowsInitial();
ccd.OutImgEvent += Ccd_OutImgEvent;
}
private void Ccd_OutImgEvent(object sender, EventArgs e)
{
HTuple width, height;
HOperatorSet.GetImageSize(sender as HObject, out width, out height);
HOperatorSet.SetPart(m_Window, 0, 0, height, width);
HOperatorSet.DispImage(sender as HObject, m_Window);
HOperatorSet.DispObj(sender as HObject, m_Window);
}
private void bnEnum_Click(object sender, EventArgs e)
{
var res=hikccdHelper.DeviceListAcq();
cbDeviceList.Items.Clear();
foreach (var m in res)
{
cbDeviceList.Items.Add(string.Format("{0},{1},{2}",m.ioType,m.userDefinedName,m.deviceSerialNum));
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
SetCtrlWhenClose();
ccd.CloseCCD();
}
private void Form1_Load(object sender, EventArgs e)
{
bnEnum_Click(null, null);
cbDeviceList.SelectedIndex = 0;
}
private void DisplayWindowsInitial()
{
//定义显示的起点和宽高
HTuple hWindowRow, hWindowColumn, hWindowWidth, hWindowHeight;
//设置显示窗口的起点和宽高
hWindowRow = 0;
hWindowColumn = 0;
hWindowWidth = pictureBox1.Width;
hWindowHeight = pictureBox1.Height;
try
{
HTuple hWindowID = (HTuple)pictureBox1.Handle;
m_Window.OpenWindow(hWindowRow, hWindowColumn, hWindowWidth, hWindowHeight, hWindowID, "visible", "");
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
return;
}
}
private void bnOpen_Click(object sender, EventArgs e)
{
var txt = cbDeviceList.Text;
if (cbDeviceList.SelectedIndex < 0) return;
try
{
ccd.OpenCCD(txt.Split(',')[2]);
SetCtrlWhenOpen();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void SetCtrlWhenOpen()
{
bnOpen.Enabled = false;
bnClose.Enabled = true;
bnStartGrab.Enabled = true;
bnStopGrab.Enabled = false;
bnContinuesMode.Enabled = true;
bnContinuesMode.Checked = true;
bnTriggerMode.Enabled = true;
cbSoftTrigger.Enabled = false;
bnTriggerExec.Enabled = false;
}
private void SetCtrlWhenClose()
{
bnOpen.Enabled = true;
bnClose.Enabled = false;
bnStartGrab.Enabled = false;
bnStopGrab.Enabled = false;
bnContinuesMode.Enabled = false;
bnTriggerMode.Enabled = false;
cbSoftTrigger.Enabled = false;
bnTriggerExec.Enabled = false;
}
private void SetCtrlWhenStopGrab()
{
bnStartGrab.Enabled = true;
bnStopGrab.Enabled = false;
bnTriggerExec.Enabled = false;
}
private void SetCtrlWhenStartGrab()
{
bnStartGrab.Enabled = false;
bnStopGrab.Enabled = true;
if (bnTriggerMode.Checked && cbSoftTrigger.Checked)
{
bnTriggerExec.Enabled = true;
}
}
private void bnClose_Click(object sender, EventArgs e)
{
ccd.CloseCCD();
SetCtrlWhenClose();
}
private void bnContinuesMode_CheckedChanged(object sender, EventArgs e)
{
ccd.SetConitnueMode();
}
private void bnTriggerMode_CheckedChanged(object sender, EventArgs e)
{
if (bnTriggerMode.Checked)
{
ccd.SetTriggerMode(hikccdTriggerModeEnum.Line0);
}
}
private void bnStartGrab_Click(object sender, EventArgs e)
{
ccd.StartGrab();
cbSoftTrigger.Enabled = true;
SetCtrlWhenStartGrab();
}
private void bnStopGrab_Click(object sender, EventArgs e)
{
ccd.StopGrab();
SetCtrlWhenStopGrab();
}
private void cbSoftTrigger_CheckedChanged(object sender, EventArgs e)
{
ccd.SetSoftTrigger(cbSoftTrigger.Checked);
if (cbSoftTrigger.Checked)
{
if (ccd.Grabbing)
{
bnTriggerExec.Enabled = true;
}
}
else
{
bnTriggerExec.Enabled = false;
}
}
private void bnTriggerExec_Click(object sender, EventArgs e)
{
if (cbSoftTrigger.Checked && ccd.Grabbing)
ccd.SoftTrigger();
}
}
}
海康相机操作类hkccdHelper v1.0
using HalconDotNet;
using MvCamCtrl.NET;
using netMarketing.Message;
using System;
using System.Collections.Generic;
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>
/// 枚举设备的信息
/// </summary>
public struct EnumDeviceInfo
{
//GigE: QT6-104-B-CAM1 (00797114078)
/// <summary>
/// 设备IO类型,有usb,GigE
/// </summary>
public string ioType;
/// <summary>
/// 用户自定义的设备名称
/// </summary>
public string userDefinedName;
/// <summary>
/// 缺少的设备名称
/// </summary>
public string ManufacturerName;
/// <summary>
/// 设备模块名称
/// </summary>
public string modelName;
/// <summary>
/// 设备备唯一的串行号
/// </summary>
public string deviceSerialNum;
}
public struct grabImgStruct
{
public HObject img;
public DateTime grabTime;
}
/// <summary>
/// 海康面阵相机操作类 hikccdHelper version1.0
/// www.skcircle.com by 刘小勇(很想停止)
/// QQ:496103864 微信:abc496103864
/// </summary>
public class hikccdHelper
{
private static MyCamera.MV_CC_DEVICE_INFO_LIST m_pDeviceList;
private MyCamera hkCamera;
private uint payloadSize;
private bool grabbing;
private byte[] m_pDataForRed = new byte[20 * 1024 * 1024];
private byte[] m_pDataForGreen = new byte[20 * 1024 * 1024];
private byte[] m_pDataForBlue = new byte[20 * 1024 * 1024];
private grabImgStruct currentImg;
public event EventHandler OutImgEvent;
private hikccdTriggerModeEnum triggerMode;
public hikccdTriggerModeEnum TriggerMode
{
get { return triggerMode; }
set { triggerMode = value; }
}
/// <summary>
/// 开始采集的状态
/// </summary>
public bool Grabbing
{
get { return grabbing; }
set { grabbing = value; }
}
public hikccdHelper(string ccdname)
{
hkCamera = new MyCamera();
}
/// <summary>
/// 取系统已经安装的海康相机数量
/// </summary>
/// <returns></returns>
public static uint GetDeviceNum()
{
return m_pDeviceList.nDeviceNum;
}
/// <summary>
/// 枚举系统已经安装的海康相机
/// </summary>
/// <returns>返回EnumDeviceInfo列表</returns>
public static List<EnumDeviceInfo> DeviceListAcq()
{
var msg = string.Empty;
var reslist = new List<EnumDeviceInfo>();
int nRet;
// ch:创建设备列表 || en: Create device list
System.GC.Collect();
nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_pDeviceList);
if (MyCamera.MV_OK != nRet)
{
msg = "Enum Devices Fail";
NotifyG.Error(msg);
throw new ArgumentException(msg);
}
// ch:在窗体列表中显示设备名 || Display the device'name on window's list
for (int i = 0; i < m_pDeviceList.nDeviceNum; i++)
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_pDeviceList.pDeviceInfo[i],
typeof(MyCamera.MV_CC_DEVICE_INFO));
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stGigEInfo, 0);
MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer,
typeof(MyCamera.MV_GIGE_DEVICE_INFO));
if (gigeInfo.chUserDefinedName != "")
{
reslist.Add(new EnumDeviceInfo()
{
ioType = "GigE",
userDefinedName = gigeInfo.chUserDefinedName,
deviceSerialNum = gigeInfo.chSerialNumber,
ManufacturerName="", modelName=""
});
}
else
{
reslist.Add(new EnumDeviceInfo()
{
ioType = "GigE",
ManufacturerName = gigeInfo.chManufacturerName,
deviceSerialNum = gigeInfo.chSerialNumber,
modelName = gigeInfo.chModelName,
userDefinedName = ""
}) ;
}
}
else if (device.nTLayerType == MyCamera.MV_USB_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stUsb3VInfo, 0);
MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)Marshal.PtrToStructure(buffer,
typeof(MyCamera.MV_USB3_DEVICE_INFO));
if (usbInfo.chUserDefinedName != "")
{
reslist.Add(new EnumDeviceInfo()
{
ioType = "USB",
deviceSerialNum = usbInfo.chSerialNumber,
userDefinedName = usbInfo.chUserDefinedName,
modelName = "",
ManufacturerName = ""
});
}
else
{
reslist.Add(new EnumDeviceInfo()
{
ioType="USB", deviceSerialNum= usbInfo.chSerialNumber,
ManufacturerName= usbInfo.chManufacturerName,
modelName = usbInfo.chModelName, userDefinedName=""
});
}
}
}
return reslist;
}
/// <summary>
/// 打开指定的相机(按序列号) 异常:ArgumentException
/// </summary>
/// <param name="serialNum"></param>
public void OpenCCD(string serialNum)
{
var msg = string.Empty;
if (m_pDeviceList.nDeviceNum == 0)
{
msg = "No device,please select";
NotifyG.Error(msg);
throw new ArgumentNullException(msg);
}
int nRet = -1;
for (int i = 0; i < m_pDeviceList.nDeviceNum; i++)
{
var device =
(MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_pDeviceList.pDeviceInfo[i],
typeof(MyCamera.MV_CC_DEVICE_INFO));
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(device.SpecialInfo.stGigEInfo, 0);
MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
if(gigeInfo.chSerialNumber== serialNum)
{
nRet = hkCamera.MV_CC_CreateDevice_NET(ref device);
if (MyCamera.MV_OK != nRet)
{
msg = "MV_CC_CreateDevice_NET Error!";
NotifyG.Error(msg);
throw new ArgumentException(msg);
}
//打开设备
nRet = hkCamera.MV_CC_OpenDevice_NET();
if (MyCamera.MV_OK != nRet)
{
msg = "Open Device Fail";
NotifyG.Error(msg);
throw new ArgumentException(msg);
}
//获取包大小
MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE();
nRet = hkCamera.MV_CC_GetIntValue_NET("PayloadSize", ref stParam);
if (MyCamera.MV_OK != nRet)
{
msg = "Get PayloadSize Fail";
NotifyG.Error(msg);
throw new ArgumentException(msg);
}
payloadSize = stParam.nCurValue;
//获取高
nRet = hkCamera.MV_CC_GetIntValue_NET("Height", ref stParam);
if (MyCamera.MV_OK != nRet)
{
msg = "Get Height Fail";
NotifyG.Error(msg);
throw new ArgumentException(msg);
}
uint nHeight = stParam.nCurValue;
//获取宽
nRet = hkCamera.MV_CC_GetIntValue_NET("Width", ref stParam);
if (MyCamera.MV_OK != nRet)
{
msg = "Get Width Fail";
NotifyG.Error(msg);
throw new ArgumentException(msg);
}
uint nWidth = stParam.nCurValue;
m_pDataForRed = new byte[nWidth * nHeight];
m_pDataForGreen = new byte[nWidth * nHeight];
m_pDataForBlue = new byte[nWidth * nHeight];
//设置触发模式为off
hkCamera.MV_CC_SetEnumValue_NET("AcquisitionMode", 2);
hkCamera.MV_CC_SetEnumValue_NET("TriggerMode", 0);
return;
}
}
msg = string.Format("serialNum[{0}] not exist!", serialNum);
NotifyG.Error(msg);
throw new ArgumentException(msg);
}
/// <summary>
/// 设置为连续拍照模式
/// </summary>
public void SetConitnueMode()
{
int nRet = MyCamera.MV_OK;
nRet = hkCamera.MV_CC_SetEnumValue_NET("TriggerMode", 0);
if (nRet != MyCamera.MV_OK)
{
NotifyG.Error("Set TriggerMode Fail");
return;
}
}
/// <summary>
/// 设置为触发模式
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void SetTriggerMode(hikccdTriggerModeEnum Mode)
{
int nRet = MyCamera.MV_OK;
nRet = hkCamera.MV_CC_SetEnumValue_NET("TriggerMode", 1);
if (nRet != MyCamera.MV_OK)
{
NotifyG.Error("Set TriggerMode Fail");
return;
}
if ((int)Mode==7)
{
nRet = hkCamera.MV_CC_SetEnumValue_NET("TriggerSource", 7);
if (nRet != MyCamera.MV_OK)
{
NotifyG.Error("Set TriggerSource Fail");
return;
}
}
else
{
nRet = hkCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)Mode);
if (nRet != MyCamera.MV_OK)
{
NotifyG.Error("Set TriggerSource Fail");
return;
}
}
}
/// <summary>
/// 外部触发-软触发
/// </summary>
/// <param name="isSoftTrigger"></param>
public void SetSoftTrigger(bool isSoftTrigger)
{
if (isSoftTrigger)
{
//触发源设为软触发
hkCamera.MV_CC_SetEnumValue_NET("TriggerSource", 7);
}
else
{
hkCamera.MV_CC_SetEnumValue_NET("TriggerSource", 0);
}
}
/// <summary>
/// 关闭相机
/// </summary>
public void CloseCCD()
{
if (grabbing)
{
grabbing = false;
//停止抓图
hkCamera.MV_CC_StopGrabbing_NET();
}
//关闭设备
hkCamera.MV_CC_CloseDevice_NET();
grabbing = false;
}
private bool IsMonoPixelFormat(MyCamera.MvGvspPixelType enType)
{
switch (enType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
return true;
default:
return false;
}
}
private bool IsColorPixelFormat(MyCamera.MvGvspPixelType enType)
{
switch (enType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BGR8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGBA8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BGRA8_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_YUYV_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12_Packed:
return true;
default:
return false;
}
}
private Int32 ConvertToMono8(object obj, IntPtr pInData, IntPtr pOutData, ushort nHeight, ushort nWidth,
MyCamera.MvGvspPixelType nPixelType)
{
if (IntPtr.Zero == pInData || IntPtr.Zero == pOutData)
{
return MyCamera.MV_E_PARAMETER;
}
int nRet = MyCamera.MV_OK;
MyCamera device = obj as MyCamera;
MyCamera.MV_PIXEL_CONVERT_PARAM stPixelConvertParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
stPixelConvertParam.pSrcData = pInData;//源数据
if (IntPtr.Zero == stPixelConvertParam.pSrcData)
{
return -1;
}
stPixelConvertParam.nWidth = nWidth;//图像宽度
stPixelConvertParam.nHeight = nHeight;//图像高度
stPixelConvertParam.enSrcPixelType = nPixelType;//源数据的格式
stPixelConvertParam.nSrcDataLen = (uint)(nWidth * nHeight * ((((uint)nPixelType) >> 16) & 0x00ff) >> 3);
stPixelConvertParam.nDstBufferSize = (uint)(nWidth * nHeight * ((((uint)MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed) >> 16) & 0x00ff) >> 3);
stPixelConvertParam.pDstBuffer = pOutData;//转换后的数据
stPixelConvertParam.enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8;
stPixelConvertParam.nDstBufferSize = (uint)(nWidth * nHeight * 3);
nRet = device.MV_CC_ConvertPixelType_NET(ref stPixelConvertParam);//格式转换
if (MyCamera.MV_OK != nRet)
{
return -1;
}
return nRet;
}
private Int32 ConvertToRGB(object obj, IntPtr pSrc, ushort nHeight, ushort nWidth,
MyCamera.MvGvspPixelType nPixelType, IntPtr pDst)
{
if (IntPtr.Zero == pSrc || IntPtr.Zero == pDst)
{
return MyCamera.MV_E_PARAMETER;
}
int nRet = MyCamera.MV_OK;
MyCamera device = obj as MyCamera;
MyCamera.MV_PIXEL_CONVERT_PARAM stPixelConvertParam = new MyCamera.MV_PIXEL_CONVERT_PARAM();
stPixelConvertParam.pSrcData = pSrc;//源数据
if (IntPtr.Zero == stPixelConvertParam.pSrcData)
{
return -1;
}
stPixelConvertParam.nWidth = nWidth;//图像宽度
stPixelConvertParam.nHeight = nHeight;//图像高度
stPixelConvertParam.enSrcPixelType = nPixelType;//源数据的格式
stPixelConvertParam.nSrcDataLen = (uint)(nWidth * nHeight * ((((uint)nPixelType) >> 16) & 0x00ff) >> 3);
stPixelConvertParam.nDstBufferSize = (uint)(nWidth * nHeight * ((((uint)MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed) >> 16) & 0x00ff) >> 3);
stPixelConvertParam.pDstBuffer = pDst;//转换后的数据
stPixelConvertParam.enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed;
stPixelConvertParam.nDstBufferSize = (uint)nWidth * nHeight * 3;
nRet = device.MV_CC_ConvertPixelType_NET(ref stPixelConvertParam);//格式转换
if (MyCamera.MV_OK != nRet)
{
return -1;
}
return MyCamera.MV_OK;
}
/// <summary>
/// 开始采集
/// </summary>
public void StartGrab()
{
int nRet;
//开启抓图
nRet = hkCamera.MV_CC_StartGrabbing_NET();
if (MyCamera.MV_OK != nRet)
{
NotifyG.Error(string.Format("Start Grabbing Fail"));
return;
}
grabbing = true;
Thread hReceiveImageThreadHandle = new Thread(ReceiveImageWorkThread);
hReceiveImageThreadHandle.Start(hkCamera);
}
/// <summary>
/// 停止采集
/// </summary>
public void StopGrab()
{
int nRet = -1;
//停止抓图
nRet = hkCamera.MV_CC_StopGrabbing_NET();
if (nRet != MyCamera.MV_OK)
{
NotifyG.Error(string.Format("Stop Grabbing Fail"));
}
grabbing = false;
}
/// <summary>
/// 软触发拍照
/// </summary>
public void SoftTrigger()
{
int nRet;
// 软触发命令
nRet = hkCamera.MV_CC_SetCommandValue_NET("TriggerSoftware");
if (MyCamera.MV_OK != nRet)
{
NotifyG.Error(string.Format("TriggerSoftware Fail"));
}
}
private void ReceiveImageWorkThread(object obj)
{
int nRet = MyCamera.MV_OK;
MyCamera device = obj as MyCamera;
MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();
IntPtr pData = Marshal.AllocHGlobal((int)payloadSize * 3);
if (pData == IntPtr.Zero)
{
return;
}
IntPtr pImageBuffer = Marshal.AllocHGlobal((int)payloadSize * 3);
if (pImageBuffer == IntPtr.Zero)
{
return;
}
uint nDataSize = payloadSize * 3;
HObject Hobj = new HObject();
IntPtr RedPtr = IntPtr.Zero;
IntPtr GreenPtr = IntPtr.Zero;
IntPtr BluePtr = IntPtr.Zero;
IntPtr pTemp = IntPtr.Zero;
while (grabbing)
{
nRet = device.MV_CC_GetOneFrameTimeout_NET(pData, nDataSize, ref pFrameInfo, 1000);
if (MyCamera.MV_OK == nRet)
{
if (IsColorPixelFormat(pFrameInfo.enPixelType))
{
if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
{
pTemp = pData;
}
else
{
nRet = ConvertToRGB(obj, pData, pFrameInfo.nHeight, pFrameInfo.nWidth, pFrameInfo.enPixelType, pImageBuffer);
if (MyCamera.MV_OK != nRet)
{
return;
}
pTemp = pImageBuffer;
}
unsafe
{
byte* pBufForSaveImage = (byte*)pTemp;
UInt32 nSupWidth = (pFrameInfo.nWidth + (UInt32)3) & 0xfffffffc;
for (int nRow = 0; nRow < pFrameInfo.nHeight; nRow++)
{
for (int col = 0; col < pFrameInfo.nWidth; col++)
{
m_pDataForRed[nRow * nSupWidth + col] = pBufForSaveImage[nRow * pFrameInfo.nWidth * 3 + (3 * col)];
m_pDataForGreen[nRow * nSupWidth + col] = pBufForSaveImage[nRow * pFrameInfo.nWidth * 3 + (3 * col + 1)];
m_pDataForBlue[nRow * nSupWidth + col] = pBufForSaveImage[nRow * pFrameInfo.nWidth * 3 + (3 * col + 2)];
}
}
}
RedPtr = Marshal.UnsafeAddrOfPinnedArrayElement(m_pDataForRed, 0);
GreenPtr = Marshal.UnsafeAddrOfPinnedArrayElement(m_pDataForGreen, 0);
BluePtr = Marshal.UnsafeAddrOfPinnedArrayElement(m_pDataForBlue, 0);
try
{
HOperatorSet.GenImage3Extern(out Hobj, (HTuple)"byte", pFrameInfo.nWidth, pFrameInfo.nHeight,
(new HTuple(RedPtr)), (new HTuple(GreenPtr)), (new HTuple(BluePtr)), IntPtr.Zero);
}
catch (System.Exception ex)
{
NotifyG.Error(string.Format("GenImage3Extern,error:[{0}]", ex.Message));
}
}
else if (IsMonoPixelFormat(pFrameInfo.enPixelType))
{
if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
{
pTemp = pData;
}
else
{
nRet = ConvertToMono8(device, pData, pImageBuffer, pFrameInfo.nHeight, pFrameInfo.nWidth, pFrameInfo.enPixelType);
if (MyCamera.MV_OK != nRet)
{
return;
}
pTemp = pImageBuffer;
}
try
{
HOperatorSet.GenImage1Extern(out Hobj, "byte", pFrameInfo.nWidth, pFrameInfo.nHeight,
pTemp, IntPtr.Zero);
}
catch (System.Exception ex)
{
NotifyG.Error(string.Format("GenImage1Extern,error:[{0}]", ex.Message));
return;
}
}
else
{
continue;
}
currentImg = new grabImgStruct()
{
img = Hobj,
grabTime = DateTime.Now
};
OutImgEvent(currentImg.img, new EventArgs());
//HalconDisplay(m_Window, Hobj, pFrameInfo.nHeight, pFrameInfo.nWidth);
}
else
{
continue;
}
}
if (pData != IntPtr.Zero)
{
Marshal.FreeHGlobal(pData);
}
if (pImageBuffer != IntPtr.Zero)
{
Marshal.FreeHGlobal(pImageBuffer);
}
return;
}
}
}
演示代码打包下载:
vs2019+halcon19.11
https://download.csdn.net/download/suneggs/12729864
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

