一、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];
内容识别如下