opencv 二维码_OpenCV二维码识别

代码​github.com

1ee8d940dbf317b24db2167cfe48af9e.png

如果你想知道更多关于二维码的细节,我建议你去维基百科看看。让我们来看看二维码检测的代码。请从下面的链接下载代码。我们还在下载部分提供了比较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.

b2241bc215dcd6cbc8652a29d2e81daa.png

比较

现在,让我们从以下几个方面来比较这两种实现。令人惊讶的是,基于ZBar的扫描仪在各个方面都优于OpenCV的二维码。

71bd590d9e018c852abb190ac3043a04.png
https://www.zhihu.com/video/1228342233734664192

速度

ZBar库的速度几乎是OpenCV二维码检测器的两倍。

鲁棒性

与OpenCV相比,ZBar库在如下视频所示的因素上产生了更健壮的结果:

  • 在不同的旋转中,ZBar是更好的或可比较的
  • 从视频中不同的缩放级别可以看出,ZBar在不同的图像大小下表现得更好
  • ZBar更擅长处理视角扭曲。

特性

ZBar库还提供了对条形码的支持,这在OpenCV中还没有。

总的来说,我们可以说二维码是最近在OpenCV中发布的,在未来的版本中可能会变得更好。在此之前,如果你想在你的应用程序中使用条形码或二维码,请坚持使用ZBar。

参考

QR Code Scanner using OpenCV 4 (C++ & Python)

OpenCV+zbar开源库实现摄像头识别二维码,测试验证识别率非常高,已实现简单的应用。 打包源码在VS2013下可以完全编译成功,附加包含OpenCV库及zbar-0.10-setup.exe,zbar-0.10.tar.bz2 下载Demo后需要安装 zbar-0.10-setup.exe 以下代码可以可以完成整个流程的开发,也可以贡献积分下载资源包。 1、 环境准备 (1) OpenCV库2.49 (2) ZBar开源库 (3) VS2013 2、 VS2013环境配置 (1) 配置附加包含目录 C/C++ -- 附加包含目录 include\opencv\include\ include\opencv\include\opencv include\opencv\include\opencv2 include (2) 配置链接器 链接器 -- 附加库目录 lib32\opencv\lib lib32 (3) 配置链接器 链接器--输入--附加依赖项 opencv_core249d.lib opencv_highgui249d.lib opencv_imgproc249d.lib libzbar-0.lib 3、 代码开发 (1)包含头文件 include include include include include include using namespace std; using namespace zbar; using namespace cv; (2)实现函数 void MatToCImage(cv::Mat &mat, CImage &cImage) { //create new CImage int width = mat.cols; int height = mat.rows; int channels = mat.channels(); cImage.Destroy(); //clear cImage.Create(width, height, 8 * channels); //默认图像像素单通道占用1个字节 //copy values uchar* ps; uchar* pimg = (uchar*)cImage.GetBits(); //A pointer to the bitmap buffer int step = cImage.GetPitch(); for (int i = 0; i (i)); for (int j = 0; j GetDlgItem(IDC_STATIC_IMG)->GetClientRect(▭); cv::VideoCapture capture(0);//从摄像头读入图像 while (!m_bCloseCamera) { cv::Mat frame; capture >> frame; cv::Mat newframe; cv::Size ResImgSiz = cv::Size(rect.Width(), rect.Height()); cv::resize(frame, newframe, ResImgSiz, CV_INTER_CUBIC); MatToCImage(newframe, imgDst); imgDst.Draw(pThis->GetDlgItem(IDC_STATIC_IMG)->GetDC()->GetSafeHdc(), rect); ImageScanner scanner; scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1); Mat imageGray; cvtColor(frame, imageGray, CV_RGB2GRAY); int width = imageGray.cols; int height = imageGray.rows; uchar *raw = (uchar *)imageGray.data; Image imageZbar(width, height, "Y800", raw, width * height); scanner.scan(imageZbar); //扫描条码 Image::SymbolIterator symbol = imageZbar.symbol_begin(); if (imageZbar.symbol_begin() == imageZbar.symbol_end()) { } else { iIndex++; if (iIndex > 999999) { iIndex = 0; } for (; symbol != imageZbar.symbol_end(); ++symbol) { char szInfo[1024]; memset(szInfo, 0, sizeof(szInfo)); sprintf(szInfo, "[d]类型:%s\r\n条码:%s\r\n", iIndex , symbol->get_type_name().c_str(), symbol->get_data().c_str()); pThis->GetDlgItem(IDC_EDIT1)->SetWindowText(szInfo); } } imageZbar.set_data(NULL, 0); } imgDst.Destroy(); capture.release(); return 0; }
您好!对于OpenCV二维码识别,您可以使用OpenCV库中的cv2模块和ZBar库来实现。下面是一个简单的示例代码,演示了如何使用OpenCV识别二维码: ```python import cv2 from pyzbar import pyzbar def decode_qrcode(image): # 转为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 创建解码器 qr_code_detector = cv2.QRCodeDetector() # 检测二维码 decoded_data, points, _ = qr_code_detector.detectAndDecodeMulti(gray) # 检查是否成功解码 if decoded_data: for i in range(len(decoded_data)): print("Decoded Data:", decoded_data[i]) # 绘制二维码边框 rect_pts = cv2.boxPoints(points[i]).astype(int) cv2.polylines(image, [rect_pts], True, (0, 255, 0), thickness=2) else: print("No QR code found") return image # 读取图像 image = cv2.imread('qrcode.png') # 解码二维码 decoded_image = decode_qrcode(image) # 显示结果 cv2.imshow("Decoded Image", decoded_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,我们首先将图像转换为灰度图像,然后使用QRCodeDetector.detectAndDecodeMulti()函数检测并解码二维码。如果成功解码,则打印出解码的数据,并绘制出二维码的边框。最后,我们将解码结果显示在窗口中。 请注意,您需要先安装pyzbar库,可以使用pip命令进行安装:`pip install pyzbar`。另外,确保您的图像文件`qrcode.png`位于当前工作目录下。 希望这能帮到您!如有任何问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值