Halcon 进阶 四 C# 实现 Halcon与迈德威视,视觉解析二维码
图像结果设备操作初始化相机设置图像处理注意事项halcon解析二维码
适合各行业 二维码数据采集、关联项目、质量追溯项目。
例如:
快销品行业,瓶盖内、外、瓶身二维码三码同步关联;瓶、盒、箱、托盘多级关联。
图像结果
设备操作
初始化
全局变量
#region Cameraprotected 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.bine(// 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);}
注意事项
先把需要dll文件拷贝到bin文件夹,注意目标平台x86和x64,根据需要拷贝dll文件,MVCAMSDK_X64.dll,MVCAMSDK.dll,MVSDK.dll还需要把迈德威视官方的cs调用文件添加到项目中MVSDK.cs相机设置,要设置触发模式为硬件触发,然后 播放,传感器触发后,软件捕获图像,进行处理halcon解码就不写了,前面几篇文章中都有