C# calls Haikang Industrial Camera SDK to collect images and display them in the Halcon window

C# calls Haikang Industrial Camera SDK to collect images and display them in the Halcon window

The recent project requires the secondary development of the Hikvision camera. Now I will sort out what I have learned.

Development environment     VS2012+C# (32-bit) Halcon12

Reference dynamic link library

Quote Halcon dynamic link library (halcondotnet.dll)

Refer to the Haikang camera dynamic link library (MvCameraControl.Net.dll). This file is located in MVS\Development\DotNet in the MVS installation directory. If you are a 32-bit development environment, select the win32 folder, if it is 64-bit, select under the win64 folder

Create camera class

First write methods in the created class, then instantiate the camera class and call the methods in the class.
       Right-click the project-Add-Class, select "Class", enter the name of the class, such as Hikvision, and click "Add" in the lower right corner.

First, the namespace to be introduced: using HalconDotNet; using MvCamCtrl.NET;

Second, all the variables that need to be used:

        private MyCamera m_pMyCamera;
        MyCamera.MV_CC_DEVICE_INFO_LIST m_pDeviceList;//设备列表
        private MyCamera.MVCC_INTVALUE stParam;//用于接收特定的参数
        //为读取、保存图像创建的数组
        UInt32 m_nBufSizeForDriver = 3072 * 2048 * 3;
        byte[] m_pBufForDriver = new byte[3072 * 2048 * 3];
        UInt32 m_nBufSizeForSaveImage = 3072 * 2048 * 3 * 3 + 2048;
        byte[] m_pBufForSaveImage = new byte[3072 * 2048 * 3 * 3 + 2048];
        //要转成的Halcon图像
        HImage image = new HImage();

(1) Find the device list

        //查找设备
        public void DeviceListAcq()
        {
            int nRet;
            // ch:创建设备列表 en:Create Device List
            System.GC.Collect();
            cbDeviceList.Items.Clear();
            nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_pDeviceList);
            if (0 != nRet)
            {
                MessageBox.Show("查找设备失败!");
                return;
            }

            // ch:在窗体列表中显示设备名 | en:Display device name in the form 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 != "")
                    {
                        cbDeviceList.Items.Add("GigE: " + gigeInfo.chUserDefinedName + " (" + gigeInfo.chSerialNumber + ")");
                    }
                    else
                    {
                        cbDeviceList.Items.Add("GigE: " + gigeInfo.chManufacturerName + " " + gigeInfo.chModelName + " (" + gigeInfo.chSerialNumber + ")");
                    }
                }
                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 != "")
                    {
                        cbDeviceList.Items.Add("USB: " + usbInfo.chUserDefinedName + " (" + usbInfo.chSerialNumber + ")");
                    }
                    else
                    {
                        cbDeviceList.Items.Add("USB: " + usbInfo.chManufacturerName + " " + usbInfo.chModelName + " (" + usbInfo.chSerialNumber + ")");
                    }
                }
            }

            // ch:选择第一项 | en:Select the first item
            if (m_pDeviceList.nDeviceNum != 0)
            {
                cbDeviceList.SelectedIndex = 0;
            }
        }

(2) Turn on the device

        //打开设备
        public void OpenDevice()
        {
            if (m_pDeviceList.nDeviceNum == 0 || cbDeviceList.SelectedIndex == -1)
            {
                MessageBox.Show("未发现设备,请选择");
                return;
            }
            int nRet = -1;

            // ch:获取选择的设备信息 | en:Get selected device information
            MyCamera.MV_CC_DEVICE_INFO device =
                (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_pDeviceList.pDeviceInfo[cbDeviceList.SelectedIndex],
                                                              typeof(MyCamera.MV_CC_DEVICE_INFO));

            // ch:打开设备 | en:Open device
            if (null == m_pMyCamera)
            {
                m_pMyCamera = new MyCamera();
                if (null == m_pMyCamera)
                {
                    return;
                }
            }

            nRet = m_pMyCamera.MV_CC_CreateDevice_NET(ref device);
            if (MyCamera.MV_OK != nRet)
            {
                return;
            }

            nRet = m_pMyCamera.MV_CC_OpenDevice_NET();
            if (MyCamera.MV_OK != nRet)
            {
                m_pMyCamera.MV_CC_DestroyDevice_NET();
                MessageBox.Show("设备打开失败");
                //ShowErrorMsg("Device open fail!", nRet);
                return;
            }

            // ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
            if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
            {
                int nPacketSize = m_pMyCamera.MV_CC_GetOptimalPacketSize_NET();
                if (nPacketSize > 0)
                {
                    nRet = m_pMyCamera.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize);
                    if (nRet != MyCamera.MV_OK)
                    {
                        Console.WriteLine("Warning: Set Packet Size failed {0:x8}", nRet);
                    }
                }
                else
                {
                    Console.WriteLine("Warning: Get Packet Size failed {0:x8}", nPacketSize);
                }
            }

            // ch:设置采集连续模式 | en:Set Continues Aquisition Mode
            m_pMyCamera.MV_CC_SetEnumValue_NET("AcquisitionMode", 2);// ch:工作在连续模式 | en:Acquisition On Continuous Mode
            m_pMyCamera.MV_CC_SetEnumValue_NET("TriggerMode", 0);    // ch:连续模式 | en:Continuous
        }

(3) Continuous collection

        //连续采集(也就是实时显示)
        public void ContinuesGrab(PictureBox picBox)
        {
            int nRet;

            // ch:开始采集 | en:Start Grabbing
            nRet = m_pMyCamera.MV_CC_StartGrabbing_NET();
            if (MyCamera.MV_OK != nRet)
            {
                MessageBox.Show("采集失败!");
                //ShowErrorMsg("Trigger Fail!", nRet);
                return;
            }

            //实时采集
            m_pMyCamera.MV_CC_SetEnumValue_NET("TriggerMode", 0);

            // ch:显示 | en:Display   在PictureBox控件中显示
            nRet = m_pMyCamera.MV_CC_Display_NET(picBox.Handle);
            if (MyCamera.MV_OK != nRet)
            {
                MessageBox.Show("显示失败!");
            }
        }

(4) Stop collection

        //停止采集
        public void StopGrab()
        {
            int nRet = -1;
            // ch:停止采集 | en:Stop Grabbing
            nRet = m_pMyCamera.MV_CC_StopGrabbing_NET();
            if (nRet != MyCamera.MV_OK)
            {
                MessageBox.Show("停止采集失败!");
            }

        }

(5) Turn off the device

        //关闭设备
        public void CloseDevice()
        {
            // ch:关闭设备 | en:Close Device
            int nRet;

            nRet = m_pMyCamera.MV_CC_CloseDevice_NET();
            if (MyCamera.MV_OK != nRet)
            {
                return;
            }

            nRet = m_pMyCamera.MV_CC_DestroyDevice_NET();
            if (MyCamera.MV_OK != nRet)
            {
                return;
            }
        }

(6) Convert to Halcon image

        //读取图片转换成Halcon图像
        public HImage ReadImage()
        {
            int nRet;
            //MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE();
            UInt32 nPayloadSize = 0;
            nRet = m_pMyCamera.MV_CC_GetIntValue_NET("PayloadSize", ref stParam);
            if (MyCamera.MV_OK != nRet)
            {
                return null;
            }
            nPayloadSize = stParam.nCurValue;
            if (nPayloadSize > m_nBufSizeForDriver)
            {
                m_nBufSizeForDriver = nPayloadSize;
                m_pBufForDriver = new byte[m_nBufSizeForDriver];
                m_nBufSizeForSaveImage = m_nBufSizeForDriver * 3 + 2048;
                m_pBufForSaveImage = new byte[m_nBufSizeForSaveImage];
            }

            IntPtr pData = Marshal.UnsafeAddrOfPinnedArrayElement(m_pBufForDriver, 0);
            MyCamera.MV_FRAME_OUT_INFO_EX stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();
            nRet = m_pMyCamera.MV_CC_GetOneFrameTimeout_NET(pData, m_nBufSizeForDriver, ref stFrameInfo, 1000);//获取一帧图像,超时时间设置为1000
            if (MyCamera.MV_OK != nRet)
            {
                return null;
            }

            HImage image = new HImage();

            //采集的是黑白图像,利用Halcon图像库中的GenImage1算子来构建图像
            image.GenImage1("byte", (int)stFrameInfo.nWidth, (int)stFrameInfo.nHeight, pData);
            return image;
        }

The following is a form interface I made . The drop-down list that displays the serial number of the device is made into a user control. Put all the above code in the user control, and call the method in the user control in the main form to implement the camera. For connection and collection , see the sample code for details.

Sample code:

        //查找设备
        private void btnEnum_Click(object sender, EventArgs e)
        {
            ucDeviceList1.DeviceListAcq();
        }

        //打开设备
        private void btnOpen_Click(object sender, EventArgs e)
        {
            ucDeviceList1.OpenDevice();
            btnOpen.Enabled = false;
            btnClose.Enabled = true;

            btnContinuesGrab.Enabled = true;
            //btnSingleStep.Enabled = true;
            btnStopGrab.Enabled = true;
        }

        //关闭设备
        private void btnClose_Click(object sender, EventArgs e)
        {
            ucDeviceList1.CloseDevice();

            btnOpen.Enabled = true;
            btnClose.Enabled = false;

            btnContinuesGrab.Enabled = false;
            btnSingleStep.Enabled = false;
            btnStopGrab.Enabled = false;
        }

        //实时显示
        private void btnContinuesGrab_Click(object sender, EventArgs e)
        {
            ucDeviceList1.ContinuesGrab(picboxShowImg);
            btnContinuesGrab.Enabled = false;
            btnSingleStep.Enabled = true;
            btnStopGrab.Enabled = true;
        }

        //单步采集
        private void btnSingleStep_Click(object sender, EventArgs e)
        {
            // 将采集到的图像在Halcon窗口中显示
            HTuple hWind = hWindowControl1.HalconWindow;

            HTuple width, height;

            HObject hv_image;
            HOperatorSet.GenEmptyObj(out hv_image);
            hv_image.Dispose();
            hv_image = ucDeviceList1.ReadImage();

            HOperatorSet.GetImageSize(hv_image, out width, out height);
            HOperatorSet.SetPart(hWind, 0, 0, height - 1, width - 1);
            HOperatorSet.DispObj(img, hWind);

            btnStopGrab.Enabled = true;
         }

        //停止采集
        private void btnStopGrab_Click(object sender, EventArgs e)
        {
            ucDeviceList1.StopGrab();
            btnContinuesGrab.Enabled = true;
            btnStopGrab.Enabled = false;
        }

        //关闭设备
        private void btnClose_Click(object sender, EventArgs e)
        {
            ucDeviceList1.CloseDevice();

            btnOpen.Enabled = true;
            btnClose.Enabled = false;

            btnContinuesGrab.Enabled = false;
            btnSingleStep.Enabled = false;
            btnStopGrab.Enabled = false;
        }

Note: The above method does not need to modify the camera IP, but it is necessary to modify the camera IP with MVS software in advance

Guess you like

Origin blog.csdn.net/Kevin_Sun777/article/details/109210383