我想用OPENCV 自带的qrcode识别和ZBar库进行二维码的识别,所用的原图如下(百度上随便找的):
![](https://img-mid.csdnimg.cn/release/static/image/mid/ask/45623759534612.jpeg?x-oss-process=image/auto-orient,1/resize,w_320,m_lfit)
经过二值化,确定角点和变换矩阵,对原图进行透视变换,再截取图片转换成灰度图得到校正后的二维码图片如下:
分别用自带的QRcode算法和ZBar库对直接二值化的图和经过校正之后的灰度图进行识别,下面用QRcode识别的代码,imageSource是灰度图,thresholdQRcode是直接二值化的图。
QRCodeDetector qrcodeDetector;
String information1;
String information2;
vector<Point> points;
bool isQRcode1 = qrcodeDetector.detect(imageSource, points);
if (isQRcode1) {
information1 = qrcodeDetector.detectAndDecode(imageSource, points);
cout << "识别成功:"<< information1 << endl;
}
else {
cout << "未识别成功!!" << endl;
}
bool isQRcode2 = qrcodeDetector.detect(thresholdQRcode, points);
if (isQRcode2) {
information2 = qrcodeDetector.detectAndDecode(thresholdQRcode, points);
cout << "识别成功:" << information2 << endl;
}
else {
cout << "未识别成功!!" << endl;
}
接着再用ZBar进行识别,都是一样的代码,代码如下:
//zbar解码--必须在exe同目录下加入两个dll文件,注意灰度图像!!!
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
int width1 = imageSource.cols;
int height1 = imageSource.rows;
uchar *raw1 = (uchar *)imageSource.data;
Image imageZbar1(width1, height1, "Y800", raw1, width1*height1);
scanner.scan(imageZbar1);
Image::SymbolIterator symbol1 = imageZbar1.symbol_begin();
if (imageZbar1.symbol_begin() == imageZbar1.symbol_end()) {
cout << "未识别成功!!" << endl;
}
else {
for (; symbol1 != imageZbar1.symbol_end(); ++symbol1) {
cout << "类型: " << symbol1->get_type_name() << endl;
cout << "条码:" << symbol1->get_data() << endl;
}
}
int width2 = thresholdQRcode.cols;
int height2 = thresholdQRcode.rows;
uchar *raw2 = (uchar *)thresholdQRcode.data;
Image imageZbar2(width2, height2, "Y800", raw2, width2*height2);
scanner.scan(imageZbar2);
Image::SymbolIterator symbol2 = imageZbar2.symbol_begin();
if (imageZbar2.symbol_begin() == imageZbar2.symbol_end()) {
cout << "未识别成功!!" << endl;
}
else {
for (; symbol2 != imageZbar2.symbol_end(); ++symbol2) {
cout << "类型: " << symbol2->get_type_name() << endl;
cout << "条码:" << symbol2->get_data() << endl;
}
}
实验结果如下:
结果表明QRcode都识别出来了,但是ZBar根据校正后的二维码却没有识别出来。我非常奇怪为啥原来直接二值化的图能够识别,我进行处理校正后的图反而识别不出来了??希望有人能解释一下。
接下来我不用灰度图,而是直接用矫正后的原图,没有转变成灰度图直接进行识别,结果如下:
出现了新的错误,同样没有识别成功,有没有人说说这错误是什么意思?
然后我对直接二值化的图像进行透视变换截取,得到矫正后的二值化图象来直接进行识别,图像如下:
![](https://img-mid.csdnimg.cn/release/static/image/mid/ask/360606795346192.jpeg?x-oss-process=image/auto-orient,1/resize,w_320,m_lfit)
结果如下:
现在结果完全倒过来了,QRcode对矫正后的图片识别不了,反而ZBar识别成功了,这到底是为啥?或者说有什么更进一步的手段能够提高识别的成功率?