1.二维码识别原理
功能图形:
-
位置探测图形:通常,二维码中有三个位置探测图形,呈现L型或大角度十字架形状,分布在二维码的三个角上,用于帮助扫描设备定位二维码的位置和方向。
-
位置探测图形分隔符:帮助扫描设备区分位置探测图形和二维码的数据区域。
-
计算模式:通常是一个小的正方形图案,用于校准扫描设备以捕捉和解码二维码的图像。
-
对齐标记:通常是一系列小的正方形图案,用于帮助扫描设备在不同的距离和角度下更好地对准和解码二维码。
编码区格式:
-
格式信息:格式信息用于指定二维码的编码格式和纠错级别。
-
版本信息:版本信息指定了二维码的大小和数据容量。。
-
数据和纠错码:编码区还包含实际的数据和纠错码。
2.二维码定位函数与识别函数
二维码定位函数 detect()
bool detect(InputArray img, OutputArray points) const;
- img: 待检测是否含有QR二维码的灰度图像或者彩色图像。
- points: 包含QR二维码的最小区域四边形的四个顶点坐标,即二维码的四个顶点坐标。
二维码识别函数decode()
std::string decode(InputArray img, InputArray points, OutputArray straight_code = noArray()) const;
- img:含有QR二维码的图像。
- points:包含QR二维码的最小区域四边形的四个顶点坐标。
- straight qrcode:经过校正和二值化的OR二维码。
示例代码:
void qrcode(Mat image){
Mat gray,qrcode_bin;
cvtColor(image,gray,COLOR_BGR2GRAY);
QRCodeDetector qrCodeDetector;
vector<Point> points;
string information;
bool isQRcode;
isQRcode=qrCodeDetector.detect(gray,points);//识别二维码
if(isQRcode){
//解码二维码
information=qrCodeDetector.decode(gray,points,qrcode_bin);
}else{
LOGD("无法识别二维码");
}
//绘制二维码的边框
for(int i=0;i<points.size();i++){
if(i==points.size()-1) {
line(image, points[i], points[0], Scalar(0, 0, 255, 255), 2, 8);
break;
}
line(image,points[i],points[i+1],Scalar(0,0,255,255),2,8);
}
//将解码内容输出到图片上
putText(image,information.c_str(),Point(20,30),2,1,Scalar(0,0,255,255),8);
//显示图像
imwrite("/sdcard/DCIM/image.png",image);
imwrite("/sdcard/DCIM/qrcode_bin.png",qrcode_bin);
}
输出图片:
经过校正和二值化的OR二维码:
3.二维码直接定位与识别函数detectAndDecode()
std::string cv::QRCodeDetector::detectAndDecode ( InputArray img,
OutputArray points = noArray(),
OutputArray straight qrcode = noArray()
)
- img:含有QR二维码的图像
- points: 包含QR二维码的最小区域四边形的四个顶点坐标
- straight_qrcode:经过校正和二值化的OR二维码
示例代码:
//利用函数直接定位二维码并解码
void qrcode2(Mat image){
Mat gray;
cvtColor(image,gray,COLOR_BGR2GRAY);
QRCodeDetector qrCodeDetector;
vector<Point> points;
string information;
information=qrCodeDetector.detectAndDecode(gray,points);
//将解码内容输出到图片上
putText(image,information.c_str(),Point(20,30),2,1,Scalar(0,0,255,255),8);
//显示图像
imwrite("/sdcard/DCIM/image2.png",image);
}
输出图片: