[OpenCV实战]11 基于OpenCV的二维码扫描器

54 篇文章 34 订阅
52 篇文章 197 订阅

目录

1 二维码(QRCode)扫描

2 结果

3 参考


在这篇文章中,我们将看到如何使用OpenCV扫描二维码。您将需要OpenCV3.4.4或4.0.0及更高版本来运行代码。

1 二维码(QRCode)扫描

在OpenCV中扫描二维码很简单。我们首先读取图像。然后,我们实例化QRCodeDetector对象并使用detectAndDecode方法来查找QR码的数据和位置。最后,我们进行结果显示。

QR Code scanner image

具体代码如下:

C++:

// QRCode_scanner.cpp

#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

/**
 * @brief 用于显示检测到的QR码周围的框
 * 
 * @param im 
 * @param bbox 
 */
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);
}

int main()
{
	// Read image
	Mat inputImage = imread("./image/demo.jpg");

	//QR检测器
	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;
	}
	return 0;
}

Python:

import cv2
import numpy as np
import time


inputImage = cv2.imread("./image/demo.jpg")

# 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
qrDecoder = cv2.QRCodeDetector()

# Detect and decode the qrcode
t = time.time()
data,bbox,rectifiedImage = qrDecoder.detectAndDecode(inputImage)
print("Time Taken for Detect and Decode : {:.3f} seconds".format(time.time() - t))
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.imwrite("output.jpg",inputImage)
cv2.waitKey(0)
cv2.destroyAllWindows()

2 结果

二维码定位画框:

命令行输出,也就是提取的二维码链接:

Decoded Data : http://LearnOpenCV.com

所获取的二维码点图:

总体来说OpenCV检测的效果只能作为研究用。所有的代码见:

https://github.com/luohenyueji/OpenCV-Practical-Exercise

实际用还是用ZBar比较好,ZBar还支持条形码的识别,OpenCV只有二维码的识别。

ZBar具体应用见:

http://zbar.sourceforge.net/

https://blog.csdn.net/qq_38712026/article/details/78674665

https://blog.csdn.net/dcrmg/article/details/52132313

3 参考

OpenCV自带二维码识别:

https://www.learnopencv.com/opencv-qr-code-scanner-c-and-python/

OpenCV上使用ZBar进行二维码和条形码识别:

https://www.learnopencv.com/barcode-and-qr-code-scanner-using-zbar-and-opencv/

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在OpenCV中解码Data Matrix ECC 140类型二维码,可以使用ZBar库。ZBar是一个开源的条码识别库,支持多种条码类型,包括Data Matrix ECC 140类型二维码。 以下是在C++中使用OpenCV和ZBar库解码Data Matrix ECC 140类型二维码的示例代码: ``` #include <opencv2/opencv.hpp> #include <zbar.h> using namespace std; using namespace cv; using namespace zbar; int main(int argc, char* argv[]) { // 打开摄像头 VideoCapture cap(0); if (!cap.isOpened()) { cout << "无法打开摄像头" << endl; return -1; } // 创建ZBar扫描器 ImageScanner scanner; scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1); while (true) { // 读取一帧图像 Mat frame; cap >> frame; // 转换为灰度图像 Mat gray; cvtColor(frame, gray, COLOR_BGR2GRAY); // 创建ZBar图像 Image zbar_image(gray.cols, gray.rows, "Y800", (uchar*)gray.data, gray.cols * gray.rows); // 扫描图像中的条码 int n = scanner.scan(zbar_image); // 遍历扫描结果 for (Image::SymbolIterator symbol = zbar_image.symbol_begin(); symbol != zbar_image.symbol_end(); ++symbol) { // 如果是Data Matrix ECC 140类型二维码 if (symbol->get_type() == ZBAR_DATABAR_EXP) { // 输出条码内容 cout << "Data Matrix ECC 140类型二维码:" << symbol->get_data() << endl; } } // 显示图像 imshow("frame", frame); // 按下ESC键退出 if (waitKey(30) == 27) { break; } } return 0; } ``` 在上面的示例代码中,我们首先使用OpenCV打开摄像头,并创建了一个ZBar扫描器。然后在循环中读取一帧图像,将其转换为灰度图像,并创建了一个ZBar图像。接着扫描图像中的条码,并遍历扫描结果,如果扫描到的是Data Matrix ECC 140类型二维码,就输出其内容。最后显示图像,并在按下ESC键后退出循环。 需要注意的是,ZBar库的安装和配置可以参考其官方文档。另外,如果你使用的是C#,也可以使用ZBar库的.NET封装来实现相同的功能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值