【机器视觉】二维码检测(QR 码)
这里写自定义目录标题二维码检测(QR码)代码二维码检测(QR码)读取QR码,可以自动定位QR码,并允许QR图像旋转任意角度。
分割设置阈值:设置二值图像的分割阈值,当像素灰度值大于等于该值为白色,否则为黑色。
自动计算阈值:软件将根据直方图分布自动计算出分割阈值。
二值图像预览:为了方便调整阈值,以二值化效果显示当前图像。参数设置
搜索二维码数量:最多被允许搜索到的二维码数量。
检测二维码颜色:选择要读取的二维码是黑色、白色。
定位核最小面积:定位标记最小面积。
定位核最大面积:定位标记最大面积。
代码在StdAfx.h的头文件中添加CKVISION相关定义#include"……IncludeCKBase.h"#include"……IncludeCKGDI.h"#include"……IncludeCKReadQRCode.h"
#ifdef_WIN64#pragmacomment(lib,“……Lib_x64CKBase.lib”)#pragmacomment(lib,“……Lib_x64CKGDI.lib”)#pragmacomment(lib,“……Lib_x64CKReader.lib”)#else#pragmacomment(lib,“……LibCKBase.lib”)#pragmacomment(lib,“……LibCKGDI.lib”)#pragmacomment(lib,“……LibCKReader.lib”)#endif
usingnamespaceCKVision;
在应用程序入口和退出的地方增加初始化和释放CKVISION库。
CKVision::InitLibrary();//初始化CKVision库
//…
//…End
CKVision::ExitLibrary();//退出CKVision库
在资源视图Dialog中添加相应的界面操作
//……详情请打开实例参考。
在对话框窗口的.h头文件中定义相应的图像处理功能:CPrImagem_Image;//基础图像CGdiRectm_Rect;//搜索ROICOverlaym_Overlay;//图像显示表面,前显示的动态图形,主要用于ROI显示。COverlaym_Results;//图像显示表面,前显示的静态图形,主要用于检测结果生成图形显示。CGdiViewm_GdiView;//图形显示视图窗口CReadQRCodem_QRCode;//二维码QRCode读取
在对话框窗口的.cpp实现文件中添加相应的功能实现。//执行voidCQRCodeDemoDlg::OnBnClickedExecute(){//TODO:在此添加控件通知处理程序代码//删除所有图形,请注意在线程中调用清除图形时,最好使用发送消息的方式,//可参考ContourDemo中的CContourDemoDlg::OnExecute()。
Overlay_DeleteAll(m_Results);
BOOLisCheck1=m_Check1.GetCheck();if(isCheck1){AutoThreshold();}
intnMaxCount=GetDlgItemInt(IDC_EDIT1);intnPos=m_Slider1.GetPos();//设置读取参数m_QRCode.SetMaxCount(nMaxCount);m_QRCode.SetThreshold(nPos);m_QRCode.SetPolarity(m_Combo1.GetCurSel());m_QRCode.SetMinArea(GetDlgItemInt(IDC_EDIT2));m_QRCode.SetMaxArea(GetDlgItemInt(IDC_EDIT3));
BeginTime();
if(m_Rect.GetVisible()){
m_QRCode.Execute(m_Image,m_Rect);////执行读取二维码功能}else{m_QRCode.Execute(m_Image,MaxROI);}
EndTime();
m_List1.DeleteAllItems();
for(inti=0;iintnItem=m_List1.InsertItem(i,_T(“”));CStringstr;str.Format(_T(“%d”),i);m_List1.SetItemText(nItem,0,str);
DPNTctPos;Center2P(pResult->border[0],pResult->border[2],ctPos);doubledAngle=0;dAngle=Angle2P(pResult->border[0],pResult->border[1]);
str.Format(_T(“%0.3f”),ctPos.x);m_List1.SetItemText(nItem,1,str);str.Format(_T(“%0.3f”),ctPos.y);m_List1.SetItemText(nItem,2,str);
str.Format(_T(“%0.3f”),dAngle);m_List1.SetItemText(nItem,3,str);
m_List1.SetItemText(nItem,4,CString(pResult->codeText));
//多边形图形CGdiPolygon*p1=newCGdiPolygon;if(p1!=NULL){p1->SetMax(4);p1->Add(pResult->border[0]);p1->Add(pResult->border[1]);p1->Add(pResult->border[2]);p1->Add(pResult->border[3]);if(pResult->codeLen>0){p1->SetPenColor(RGB(0,255,0));}else{p1->SetPenColor(RGB(255,0,0));}p1->SetPenWidth(2);m_Results.AddItem(p1);//添加到显示}CGdiPoint*p2=newCGdiPoint(ctPos);if(p2!=NULL){p2->SetSize(21);p2->SetStyle(0);p2->SetPenWidth(1);p2->SetPenColor(RGB(0,255,0));m_Results.AddItem(p2);//添加到显示}
for(intn=0;npText->SetPosition(pResult->border[n].x,pResult->border[n].y);pText->SetPenColor(RGB(0,0,255));m_Results.AddItem(pText);//添加到显示
}}}}
m_GdiView.Redraw();//刷新显示}
//……详情请打开实例参考。