关于使用海康相机SDK采集图片并传递给C++的使用总结

一.背景

需要用C#调用海康相机SDK采集图片,并将采集的图片以Byte[]数组的形式传递给C++版视觉处理dll

二.步骤

1.声明变量         

        public MyCamera myCamera;//相机对象
        MyCamera.MV_CC_DEVICE_INFO_LIST m_pDeviceList;        
        IntPtr m_BufForDriver = IntPtr.Zero;
        private static Object BufForDriverLock = new Object();

2.初始化相机

 public int InitCamera(IntPtr handle)
        {
            //枚举设备,默认选择第一个
            try
            {
                
                MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_pDeviceList);
//这里默认选择了第一个相机      
                MyCamera.MV_CC_DEVICE_INFO device =
              (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_pDeviceList.pDeviceInfo[0],
                                                                  typeof(MyCamera.MV_CC_DEVICE_INFO));
                int nRet = -1;
                // ch:打开设备 | en:Open device
                if (null == myCamera)
                {
                    myCamera = new MyCamera();
                    if (null == myCamera)
                    {
                        return -1;
                    }
                }
                //创建设备
                nRet = myCamera.MV_CC_CreateDevice_NET(ref device);
                if (MyCamera.MV_OK != nRet)
                {
                    return -1;
                }
                //打开设备
                nRet = myCamera.MV_CC_OpenDevice_NET();
                if (MyCamera.MV_OK != nRet)
                {
                    myCamera.MV_CC_DestroyDevice_NET();
                    //System.Windows.Forms.MessageBox.Show("open device Fail!");
                    ShowErrorMsg("Device open fail!", nRet);
                    return -1;
                }
                // 开始 grabing
                int temp = myCamera.MV_CC_StartGrabbing_NET();
                if (MyCamera.MV_OK != temp)
                {
                    ShowErrorMsg("Trigger Fail!", temp);
                    return -1;
                }
                //获得显示句柄
                //int nRet2 = myCamera.MV_CC_Display_NET(handle);
                //if (MyCamera.MV_OK != temp)
                //{
                //    ShowErrorMsg("Display Fail!", nRet2);
                //    return -1;
                //}
                // 设置采集模式 -触发模式;触发源-软触发; 触发一次
                myCamera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
                myCamera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);
                return 0;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return -1;

            }
        }

3.触发拍照

 public int TakePhoto()
        {
            try
            {
                int nRet;
                // ch:触发命令 | en:Trigger command ,触发一次
                nRet = myCamera.MV_CC_SetCommandValue_NET("TriggerSoftware");
                if (MyCamera.MV_OK != nRet)
                {
                    ShowErrorMsg("Trigger Fail!", nRet);
                    return -1;
                }
                return 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return -1;
            }
        }

4.取像、显示并转换传递出去

 public void ReceiveAndConvert()
        {
            MyCamera.MV_FRAME_OUT stFrameOut = new MyCamera.MV_FRAME_OUT();
            MyCamera.MV_DISPLAY_FRAME_INFO stDisplayInfo = new MyCamera.MV_DISPLAY_FRAME_INFO();
      
//此处的延时很重要,不合适会有拖影,测试相机为6500w像素 其中曝光500ms最低800ms,
                int nRet = m_MyCamera.MV_CC_GetImageBuffer_NET(ref stFrameOut, 1000);
          
                if (nRet == MyCamera.MV_OK)
                {

                    //显示
                    stDisplayInfo.hWnd = pictureBox1.Handle;
                    stDisplayInfo.pData = stFrameOut.pBufAddr;
                    stDisplayInfo.nDataLen = stFrameOut.stFrameInfo.nFrameLen;
                    stDisplayInfo.nWidth = stFrameOut.stFrameInfo.nWidth;
                    stDisplayInfo.nHeight = stFrameOut.stFrameInfo.nHeight;
                    stDisplayInfo.enPixelType = stFrameOut.stFrameInfo.enPixelType;
                    int nret = m_MyCamera.MV_CC_DisplayOneFrame_NET(ref stDisplayInfo);
//  display
                    if (nret != MyCamera.MV_OK)
                    {
                        Console.WriteLine("display error!");
                        
                        break;
                    }
//copy convert to byte[]
                    byte[] data = new byte[stFrameOut.stFrameInfo.nFrameLen];

                    Marshal.Copy(stFrameOut.pBufAddr, data, 0, (int)stFrameOut.stFrameInfo.nFrameLen);
                    
                    m_MyCamera.MV_CC_FreeImageBuffer_NET(ref stFrameOut);
//save
                    //SavePic(stFrameOut.pBufAddr, stFrameOut.stFrameInfo, res, 1);
              
                    //图像处理在此处进行
                    byte[] bPara = new byte[100000];
                    int detectres = -1;
                    try
                    {
                           detectres = C++Dll.VisionMethod(data);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    
                }
            }
        }

5.finished

猜你喜欢

转载自blog.csdn.net/u012422524/article/details/120035851