我们前面两课准备好了实验小平台,即一个MFC界面,左右各有一个Picture Control,左边设想放原始图,右边设想放效果图,中间放一个OpenCV图像处理的一些函数,学习并感性认知这些图像处理的知识对图片的实际影响。
今天学习笔记的题目需求是:
1,用OpenCV读取一个包含二维码的图片,原始图片显示在左边的Picture Control;
2,检测、识别这个二维码图片,画出二维码有效的ROI区域;
3,把第2点的结果图片显示在右边的Picture Control;
4,把第2点的二维码的解码值显示在底部的Edit Text里。
基本界面如图:
void CQRTestDlg::OnBnClickedBtnload()
{
//ATL中的一个宏定义。用于编码转换(用的比较多的是CString向LPCWSTR转换)
//该语句的内存不释放,不可用于循环中,
USES_CONVERSION;
cv::Mat mtSrc = cv::imread(W2A(fun_LoadImg()), 1);//fun_LoadImg()代码在上节课
DrawMat(mtSrc , IDC_STATIC1);//先完成需求1
/*
这
中间
得先
空
一大块
留
以后用,
猜一猜
这一段做啥用呢?
*/
QRCodeDetector qrDecoder = QRCodeDetector();
cv::Mat mtStraightQR;
vector<Point> ptROI;
/*
在OpenVC4之后,qrDecoder.detect和qrDecoder.qrDecoder.decode被detectAndDecode取代了
detectAndDecode这2个参数是输出二维码ROI的4个点位坐标,
第3个参数是把花里胡哨的的二维码解析成最纯粹、直白、无添加剂的二维码
*/
CString qrData = CString(qrDecoder.detectAndDecode(mtSrc, ptROI, mtStraightQR).c_str()); //完成需求2
if (qrData.GetLength()>0)//如果取值成功
{
if (ptROI.size() == 4)
{
//画出ROI
rectangle(mtSrc, ptROI[0], ptROI[2], Scalar(0, 0, 255),2);
}
}
DrawMat(mtSrc, IDC_STATIC2);//完成需求3,把图在Picture显示,这代码上节笔记有
//DrawMat(mtStraightQR, IDC_STATIC2);//建议也试试显示Straight_QRCode的效果
GetDlgItem(IDC_EDIT1)->SetWindowText(qrData);//完成需求4
}
至此,今日笔记作业完成。可以看到,OpenCV4的二维码识别的C++代码非常的简单。有兴趣的朋友可以试试看检测和识别二维码,单兵作战的detectAndDecode的识别成功率怎么样呢??
答案是光凭detectAndDecode来识别的效果很不好,只能识别那些不加修饰和杂项的二维码图片。
以上代码中间注释并空下来的那一大段,是告诉我们,在识别二维码动作前,是需要对图像进行预处理的。这也便是下一次笔记内容了。