我们前面两课准备好了实验小平台,即一个MFC界面,左右各有一个Picture Control,左边设想放原始图,右边设想放效果图,中间放一个OpenCV图像处理的一些函数,学习并感性认知这些图像处理的知识对图片的实际影响。

今天学习笔记的题目需求是:

1,用OpenCV读取一个包含二维码的图片,原始图片显示在左边的Picture Control;

2,检测、识别这个二维码图片,画出二维码有效的ROI区域;

3,把第2点的结果图片显示在右边的Picture Control;

4,把第2点的二维码的解码值显示在底部的Edit Text里。

基本界面如图:

opencv图片解析二维码和条形码 opencv 二维码解码_二维码

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	
}

opencv图片解析二维码和条形码 opencv 二维码解码_opencv图片解析二维码和条形码_02

至此,今日笔记作业完成。可以看到,OpenCV4的二维码识别的C++代码非常的简单。有兴趣的朋友可以试试看检测和识别二维码,单兵作战的detectAndDecode的识别成功率怎么样呢??

答案是光凭detectAndDecode来识别的效果很不好,只能识别那些不加修饰和杂项的二维码图片。

以上代码中间注释并空下来的那一大段,是告诉我们,在识别二维码动作前,是需要对图像进行预处理的。这也便是下一次笔记内容了。