如果你想知道更多关于二维码的细节,我建议你去维基百科看看。让我们来看看二维码检测的代码。请从下面的链接下载代码。我们还在下载部分提供了比较ZBar和OpenCV二维码检测器的代码。
C++ Code
First include the required header files
#include <opencv2/objdetect.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Utility function to display the box around the detected QR Code
void display(Mat &im, Mat &bbox)
{
int n = bbox.rows;
for(int i = 0 ; i < n ; i++)
{
line(im, Point2i(bbox.at<float>(i,0),bbox.at<float>(i,1)), Point2i(bbox.at<float>((i+1) % n,0), bbox.at<float>((i+1) % n,1)), Scalar(255,0,0), 3);
}
imshow("Result", im);
}
在主要的funcion中,我们首先阅读图像。然后,我们实例化一个QRCodeDetector对象,并使用detectAndDecode方法来查找数据和二维码的位置。最后,显示结果。
int main(int argc, char* argv[])
{
// Read image
Mat inputImage;
if(argc>1)
inputImage = imread(argv[1]);
else
inputImage = imread("qrcode-learnopencv.jpg");
QRCodeDetector qrDecoder = QRCodeDetector::QRCodeDetector();
Mat bbox, rectifiedImage;
std::string data = qrDecoder.detectAndDecode(inputImage, bbox, rectifiedImage);
if(data.length()>0)
{
cout << "Decoded Data : " << data << endl;
display(inputImage, bbox);
rectifiedImage.convertTo(rectifiedImage, CV_8UC3);
imshow("Rectified QRCode", rectifiedImage);
waitKey(0);
}
else
cout << "QR Code not detected" << endl;
}
Python Code
First import the modules
import cv2
import numpy as np
import sys
import time
Next, we read the input image, you can specify your own image from the command line
if len(sys.argv)>1:
inputImage = cv2.imread(sys.argv[1])
else:
inputImage = cv2.imread("qrcode-learnopencv.jpg")
Utility function to display the box around the QR Code
# Display barcode and QR code location
def display(im, bbox):
n = len(bbox)
for j in range(n):
cv2.line(im, tuple(bbox[j][0]), tuple(bbox[ (j+1) % n][0]), (255,0,0), 3)
# Display results
cv2.imshow("Results", im)
Create a QRCodeDetector Object and detect the code and its location using the detectAndDecode method.
qrDecoder = cv2.QRCodeDetector()
# Detect and decode the qrcode
data,bbox,rectifiedImage = qrDecoder.detectAndDecode(inputImage)
if len(data)>0:
print("Decoded Data : {}".format(data))
display(inputImage, bbox)
rectifiedImage = np.uint8(rectifiedImage);
cv2.imshow("Rectified QRCode", rectifiedImage);
else:
print("QR Code not detected")
cv2.imshow("Results", inputImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
Output
The decoded data is shown on the Terminal and a bounding box is drawn around the detected QR Code.
比较
现在,让我们从以下几个方面来比较这两种实现。令人惊讶的是,基于ZBar的扫描仪在各个方面都优于OpenCV的二维码。
速度
ZBar库的速度几乎是OpenCV二维码检测器的两倍。
鲁棒性
与OpenCV相比,ZBar库在如下视频所示的因素上产生了更健壮的结果:
- 在不同的旋转中,ZBar是更好的或可比较的
- 从视频中不同的缩放级别可以看出,ZBar在不同的图像大小下表现得更好
- ZBar更擅长处理视角扭曲。
特性
ZBar库还提供了对条形码的支持,这在OpenCV中还没有。
总的来说,我们可以说二维码是最近在OpenCV中发布的,在未来的版本中可能会变得更好。在此之前,如果你想在你的应用程序中使用条形码或二维码,请坚持使用ZBar。
参考
QR Code Scanner using OpenCV 4 (C++ & Python)