using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MvCamCtrl.NET;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.IO;
using OpenCvSharp;
namespace CarMachineModel.DeviceShare
{
public class CameraCommon
{
private static MyCamera.MV_CC_DEVICE_INFO_LIST list_Device = default(MyCamera.MV_CC_DEVICE_INFO_LIST);
public static List<string>? SerialNum;
public static CameraCommon camera= new CameraCommon();
/// <summary>
/// 列举设备
/// </summary>
/// <param name="Errmsg"></param>
/// <returns></returns>
public static List<string> EnumCamera(out string Errmsg)
{
System.GC.Collect();
List<string> SerialNum = new List<string>();
list_Device = default(MyCamera.MV_CC_DEVICE_INFO_LIST);
int ret = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref list_Device);
if(ret !=0)
{
Errmsg = "枚举失败";
return null;
}
for (int i = 0; i < list_Device.nDeviceNum; i++)
{
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(list_Device.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
SerialNum.Add(gigeInfo.chSerialNumber);
}
else if (device.nTLayerType == MyCamera.MV_USB_DEVICE)
{
MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stUsb3VInfo, typeof(MyCamera.MV_USB3_DEVICE_INFO));
SerialNum.Add(usbInfo.chSerialNumber);
}
}
Errmsg =null;
return SerialNum;
}
private MyCamera m_MyCamera = new MyCamera();
/// <summary>
/// 创建句柄
/// </summary>
public void CreateCameraHandle()
{
MyCamera.MV_CC_DEVICE_INFO device =
(MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(list_Device.pDeviceInfo[0],
typeof(MyCamera.MV_CC_DEVICE_INFO));
if (null == m_MyCamera)
{
m_MyCamera = new MyCamera();
if (null == m_MyCamera)
{
return;
}
}
//创建句柄
int nRet = m_MyCamera.MV_CC_CreateDevice_NET(ref device);
if (MyCamera.MV_OK != nRet)
{
return;
}
}
/// <summary>
/// 打开相机
/// </summary>
/// <exception cref="ArgumentNullException"></exception>
public void OpenCamera()
{
if(m_MyCamera == null)
{
throw new ArgumentNullException("创建句柄失败");
}
int nRet = m_MyCamera.MV_CC_OpenDevice_NET();
if (MyCamera.MV_OK != nRet)
{
m_MyCamera.MV_CC_DestroyDevice_NET();
return;
}
}
public void StartGrabImage()
{
int nRet = m_MyCamera.MV_CC_StartGrabbing_NET();
if (MyCamera.MV_OK != nRet)
{
return;
}
}
public static void InitCamera()
{
EnumCamera(out string vv);
camera.CreateCameraHandle();
camera.OpenCamera();
camera.StartGrabImage();
}
protected byte[]? bufferDriver;
protected uint bufferForDriver;
public Mat GetOneFrame()
{
IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(bufferDriver, 0);
MyCamera.MV_FRAME_OUT_INFO_EX mV_FRAME_OUT_INFO_EX = default(MyCamera.MV_FRAME_OUT_INFO_EX);
int ret = m_MyCamera.MV_CC_GetOneFrameTimeout_NET(ptr, bufferForDriver,ref mV_FRAME_OUT_INFO_EX,1000);
if (ret != 0)
{
return null;
}
return MvSrctoMat(ptr, mV_FRAME_OUT_INFO_EX);
}
public Mat MvSrctoMat(IntPtr pData, MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
{
Mat mat;
if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_BGR8_Packed)
{
return mat = new Mat(pFrameInfo.nHeight, pFrameInfo.nWidth, MatType.CV_8UC3, pData, 0L);
}
//注意这个是否正确
if (isMonoData(pFrameInfo.enPixelType))
{
return new Mat(pFrameInfo.nWidth, pFrameInfo.nHeight, MatType.CV_8UC1, pData);
}
IntPtr intPtr = IntPtr.Zero;
if (intPtr == IntPtr.Zero)
{
intPtr = Marshal.AllocHGlobal(pFrameInfo.nWidth * pFrameInfo.nHeight * 3);
}
MyCamera.MV_PIXEL_CONVERT_PARAM pstCvtParam = default(MyCamera.MV_PIXEL_CONVERT_PARAM);
pstCvtParam.nWidth = pFrameInfo.nWidth;
pstCvtParam.nHeight = pFrameInfo.nHeight;
pstCvtParam.pSrcData = pData;
pstCvtParam.enSrcPixelType = pFrameInfo.enPixelType;
pstCvtParam.nSrcDataLen = pFrameInfo.nFrameLen;
pstCvtParam.enDstPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_BGR8_Packed;
pstCvtParam.pDstBuffer = intPtr;
pstCvtParam.nDstBufferSize = (uint)(pFrameInfo.nWidth * pFrameInfo.nHeight * 3 + 2048);
int num = m_MyCamera!.MV_CC_ConvertPixelType_NET(ref pstCvtParam);
mat = new Mat(pFrameInfo.nHeight, pFrameInfo.nWidth, MatType.CV_8UC1, pstCvtParam.pSrcData, 0L);
Marshal.FreeHGlobal(intPtr);
return mat;
}
public static bool isMonoData(MyCamera.MvGvspPixelType mvGvspPixelType)
{
switch (mvGvspPixelType)
{
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
return true;
default:
return false;
}
}
}
}
MVS采集的图像转换成为mat
最新推荐文章于 2023-06-15 15:05:32 发布