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