OpenCV每日函数 Object Detection目标检测模块 (3) 二维码检测和生成

一、QRCodeEncoder类

        OpenCV提供的二维码生成的类。没有进行测试,可能是最新提供的,之前下载的opencv源码内没有,懒得编译,opencvsharp 4.6内也没有,可能需要等,不过在opencv的github上看到了test代码,应该是实现了。opencv/test_qrcode.cpp at 583bd1a6e20c6be6ca6a99c2f0d415ee20e28722 · opencv/opencv · GitHubOpen Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.https://github.com/opencv/opencv/blob/583bd1a6e20c6be6ca6a99c2f0d415ee20e28722/modules/objdetect/test/test_qrcode.cpp

1、函数原型

        从输入字符串生成二维码。

virtual void cv::QRCodeEncoder::encode	(	const String & 	encoded_info,
OutputArray 	qrcode 
)		

2、参数详解

encoded_info 输入要编码的字符串。
qrcode 生成的二维码。

二、QRCodeDetector

        OpenCV提供的二维码检测的类。

1、函数原型

        QRCodeDetector类下有一系列的方法,主要是检测、解码、曲面检测、解码等等。

decode (InputArray img, InputArray points, OutputArray straight_qrcode=noArray())
decodeCurved (InputArray img, InputArray points, OutputArray straight_qrcode=noArray())
decodeMulti (InputArray img, InputArray points, std::vector< std::string > &decoded_info, OutputArrayOfArrays straight_qrcode=noArray())
detectAndDecode (InputArray img, OutputArray points=noArray(), OutputArray straight_qrcode=noArray())

2、参数详解

img 包含二维码的灰度或彩色 (BGR) 图像。
decoded_info UTF8 编码的字符串输出向量或字符串的空向量(如果代码无法解码)。
points 找到的二维码四边形的顶点的可选输出向量。 如果找不到,则为空。
straight_qrcode 包含校正和二值化二维码的图像的可选输出向量。

三、OpenCV源码

1、源码路径

opencv\modules\objdetect\src\qrcode.cpp

2、源码代码

        下面仅列出几个方法的源码,QRCode的源码比较多。

bool QRCodeDetector::detect(InputArray in, OutputArray points) const
{
    Mat inarr;
    if (!checkQRInputImage(in, inarr))
        return false;

    QRDetect qrdet;
    qrdet.init(inarr, p->epsX, p->epsY);
    if (!qrdet.localization()) { return false; }
    if (!qrdet.computeTransformationPoints()) { return false; }
    vector<Point2f> pnts2f = qrdet.getTransformationPoints();
    updatePointsResult(points, pnts2f);
    return true;
}
static void updatePointsResult(OutputArray points_, const vector<Point2f>& points)
{
    if (points_.needed())
    {
        int N = int(points.size() / 4);
        if (N > 0)
        {
            Mat m_p(N, 4, CV_32FC2, (void*)&points[0]);
            int points_type = points_.fixedType() ? points_.type() : CV_32FC2;
            m_p.reshape(2, points_.rows()).convertTo(points_, points_type);  // Mat layout: N x 4 x 2cn
        }
        else
        {
            points_.release();
        }
    }
}
bool QRCodeDetector::detectAndDecodeMulti(
        InputArray img,
        CV_OUT std::vector<cv::String>& decoded_info,
        OutputArray points_,
        OutputArrayOfArrays straight_qrcode
    ) const
{
    Mat inarr;
    if (!checkQRInputImage(img, inarr))
    {
        points_.release();
        return false;
    }

    vector<Point2f> points;
    bool ok = detectMulti(inarr, points);
    if (!ok)
    {
        points_.release();
        return false;
    }
    updatePointsResult(points_, points);
    decoded_info.clear();
    ok = decodeMulti(inarr, points, decoded_info, straight_qrcode);
    return ok;
}

四、效果图像示例

        下面的二维码是随便生成的,

        参考代码如下 

OpenCvSharp.QRCodeDetector qRCodeDetector = new OpenCvSharp.QRCodeDetector();
Point2f[] points;
Mat mat = new Mat();
String[] str = null;
qRCodeDetector.DetectAndDecode(gray1, out points, mat);
qRCodeDetector.DecodeMulti(gray1, points, out str);
if(str!=null && str.Length>0)
    this.richTextBox1.Text = str[0];

         内容识别如下

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/125300314