资讯详情

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

Halcon 进阶 四 C# 实现 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解码就不写了,前面几篇文章中都有

标签: 瓶盖传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台