Halcon 进阶 四 C# 实现 Halcon与迈德威视,视觉解析二维码

该博客介绍了如何使用C#结合Halcon库和迈德威视SDK进行二维码图像处理。内容包括设备初始化、相机设置、图像捕获与处理,以及解码结果显示。在设备操作部分,详细展示了连接、设置、抓图、播放和停止等步骤。在图像处理阶段,特别强调了帧处理回调函数的作用。注意事项提及了DLL文件的适配和相机触发模式设置。
摘要由CSDN通过智能技术生成

Halcon 进阶 四 C# 实现 Halcon与迈德威视,视觉解析二维码

halcon解析二维码
适合各行业 二维码数据采集、关联项目、质量追溯项目。
例如:
快销品行业,瓶盖内、外、瓶身二维码三码同步关联;瓶、盒、箱、托盘多级关联。

图像结果

在这里插入图片描述

设备操作

初始化

全局变量

		#region Camera

        protected IntPtr m_Grabber = IntPtr.Zero;
        protected CameraHandle m_hCamera = 0;
        protected tSdkCameraDevInfo[] m_DevInfo;
        protected pfnCameraGrabberFrameListener m_FrameListener;
        protected pfnCameraGrabberSaveImageComplete m_SaveImageComplete;
        Data_Code_Reader code_Reader_Out;
        #endregion

连接设备

这里面用到了 h_out_window(halcon控件) 和
DispWnd1(PictureBox控件),没做区分,解码显示在h_out_window


	public void Init_Device()
       {
       		// 初始化 halcon,
        	code_Reader_Out = new Data_Code_Reader(){Time_Out = 50,};
            h_out_window.ImagePart = new Rectangle(0, 0, HY.Base.BaseSetting.Decode_Set.Out_Width, HY.Base.BaseSetting.Decode_Set.Out_Height);
            code_Reader_Out.Open_Window(h_out_window.HalconWindow);
       m_FrameListener = new pfnCameraGrabberFrameListener(CameraGrabberFrameListener);
            m_SaveImageComplete = new pfnCameraGrabberSaveImageComplete(CameraGrabberSaveImageComplete);
            MvApi.CameraEnumerateDevice(out m_DevInfo);
            if (m_DevInfo != null && m_DevInfo.Count() > 0)
            {
                if (MvApi.CameraGrabber_Create(out m_Grabber, ref m_DevInfo[0]) == CameraSdkStatus.CAMERA_STATUS_SUCCESS)
                {
                    MvApi.CameraGrabber_GetCameraHandle(m_Grabber, out m_hCamera);
                    MvApi.CameraCreateSettingPage(m_hCamera, this.Handle, m_DevInfo[0].acFriendlyName, null, (IntPtr)0, 0);
                    MvApi.CameraGrabber_SetFrameListener(m_Grabber, m_FrameListener, IntPtr.Zero);
                    MvApi.CameraGrabber_SetSaveImageCompleteCallback(m_Grabber, m_SaveImageComplete, IntPtr.Zero);
                    MvApi.CameraGrabber_SetHWnd(m_Grabber, DispWnd1.Handle);
                    return;
                }
                else
                {
                    CloseEQ();
                    ShowLog("设备初始化失败", EnumClass.ShowLogColor.Error);
                }
            }
            else
            {
                CloseEQ();
                ShowLog("设备初始化失败", EnumClass.ShowLogColor.Error);
                return;
            }
		}

相机设置

 		#region 相机
        private void buttonSettings_Click(object sender, EventArgs e)
        {
            if (m_Grabber != IntPtr.Zero)
                MvApi.CameraShowSettingPage(m_hCamera, 1);
        }
		//抓图
        private void buttonSnap_Click(object sender, EventArgs e)
        {
            if (m_Grabber != IntPtr.Zero)
                MvApi.CameraGrabber_SaveImageAsync(m_Grabber);
        }
		//播放
        private void buttonPlay_Click(object sender, EventArgs e)
        {
            if (m_Grabber != IntPtr.Zero)
                MvApi.CameraGrabber_StartLive(m_Grabber);
        }
		//停止
        private void buttonStop_Click(object sender, EventArgs e)
        {
            if (m_Grabber != IntPtr.Zero)
                MvApi.CameraGrabber_StopLive(m_Grabber);
        }
        #endregion

图像处理

		 // 每当Grabber捕获到一帧图像时,会分3个阶段来依次调用FrameListener
        // 如果FrameListener返回0,Grabber将会丢弃此帧并结束针对此帧的所有后续处理阶段
        // 阶段0: RAW数据处理,pFrameBuffer=Raw数据
        // 阶段1: 截图前处理,pFrameBuffer=RGB数据
        // 阶段2: 显示前处理,pFrameBuffer=RGB数据
        private int CameraGrabberFrameListener(IntPtr Grabber, int Phase, IntPtr pFrameBuffer, ref tSdkFrameHead pFrameHead, IntPtr Context)
        {
            if (Phase == 0)
            {
                // RAW数据处理,pFrameBuffer=Raw数据
            }
            else if (Phase == 1)
            {
                // 截图前处理,pFrameBuffer=RGB数据
            }
            else if (Phase == 2)
            {
                GC.Collect();//强制进行即时垃圾回收,防止内存溢出

                    int w = pFrameHead.iWidth;
                    int h = pFrameHead.iHeight;

                    Boolean gray = (pFrameHead.uiMediaType ==
                        (uint)emImageFormat.CAMERA_MEDIA_TYPE_MONO8);
                    //MvApi.CameraGrabber_SaveImageAsync(m_Grabber[0]);
                    // 显示前处理,pFrameBuffer=RGB数据
                    HObject himage;
                    string time = "0";
                    string decode_str = "";
                    HOperatorSet.GenImageInterleaved(out himage, pFrameBuffer, "bgr", w, h, -1, "byte", w, h, 0, 0, -1, 0);
                    code_Reader_Out.get_reader_data_ex(himage, out decode_str, out time);
                    //decode_str,在这里处理解码数据
              
                // 显示前处理,pFrameBuffer=RGB数据
            }
            return 1;
        }
        // 需要调用CameraImage_Destroy释放  ,保存图像处理
        private void CameraGrabberSaveImageComplete(IntPtr Grabber, IntPtr Image, CameraSdkStatus Status, IntPtr Context)
        {
            if (Image != IntPtr.Zero)
            {
                //imgReader.GetReaderString1(Image, null);
                //string filename = System.IO.Path.Combine(
                //        AppDomain.CurrentDomain.BaseDirectory.ToString(),
                //        string.Format("{0}.bmp", System.Environment.TickCount));

                //byte[] filename_bytes = Encoding.Default.GetBytes(filename);
                //MvApi.CameraImage_SaveAsBmp(Image, filename_bytes);

                //MessageBox.Show(filename);
            }

            MvApi.CameraImage_Destroy(Image);
        }

注意事项

  1. 先把需要dll文件拷贝到bin文件夹,注意目标平台x86和x64,根据需要拷贝dll文件,MVCAMSDK_X64.dll,MVCAMSDK.dll,MVSDK.dll
  2. 还需要把迈德威视官方的cs调用文件添加到项目中MVSDK.cs
  3. 相机设置,要设置触发模式为硬件触发,然后 播放,传感器触发后,软件捕获图像,进行处理
  4. halcon解码就不写了,前面几篇文章中都有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫伊

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值