C++利⽤OpenCV识别⼆维码QRCode
引⼦
项⽬需要⽤到C++进⾏⼆维码识别,虽然⼿机上随便扫码就可以轻易识别出来,但是到了电脑上可就没有那么⽅便了。
我要做的是能够⼀下⼦把⼀张图⽚上的⼏⼗个⼆维码⼀下⼦识别出来,如果成功的话,那岂不是⽐⽤⼿机⼀张张扫码快许多啊。当然现在已经成功了,现在把配置过程记录⼀下。
我查阅了⼀⼤堆资料,识别⼆维码的⽅法有很多,基本上分为⽤zbar和zxing两种,但是对效果来看,zxing的识别更胜⼀筹,⽽且zbar已经停⽌更新了。那么,作为9012年的萌薪,当然是选择效果强⼤的zxing了啊。
⽅法⼀:zxing
1. 原理
简单来讲,它先⼆维码的三个⾓点,如果到才会进⾏解码。
2. ⾸先
我们需要⼀份包装包:,这是C++版本的,将它下载到你的电脑上
3. 编译安装
建⽴⼀个build的⽂件夹,编译,安装,命令⾏如下。
mkdir build
cd build
cmake ..
make
make install
这样就ok了。需要注意的是,⾥⾯有OpenCV的依赖选项,所以最好提前配置好OpenCV。
4. 安装完成
如果你成功编译了,那么在build⽂件夹⾥⾯会有⼀个叫做libzxing.a⽂件,这就是你编译好的静态链接库,后⾯你想调⽤zxing的话就得把这个⽂件导进去。
5. 识别⼆维码
这⾥我编写了⼀个简单的函数,思想是,先⽤OpenCV imread函数读取图⽚,然后将其装换为灰度图,然后调⽤zxing的解码函数得到识别结果进⾏输出。
⾸先准备好这个很基本,但很重要。
cmake_minimum_required (VERSION 3.1)
# Enable C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
# 调试模式
set(CMAKE_BUILD_TYPE "Debug")
project (newPipeLocation)
#这是我⾃⼰的OpenCV安装路径
set(OpenCV_DIR /usr/local)
# zxing
set(ZXing_DIR /usr/local)
find_package(OpenCV 4 REQUIRED)
include_directories(
${OpenCV_DIR}/include
印度暴雨致近200人遇难
${ZXing_DIR}/include/zxing
/home/wwh/Downloads/zxing-cpp/core/src
/home/wwh/Downloads/zxing-cpp/opencv/src
)
add_executable(main main.cpp)
# 这⾥的libzxing.a很重要
target_link_libraries(main
${OpenCV_LIBS}
/home/w/Downloads/zxing-cpp/build/libzxing.a
)
主函数如下:(这个代码的好处是如果检测不到⼆维码,也可以输出⼀条显⽰信息,⽽不会使得程序崩溃)
#include<opencv2/opencv.hpp>
#include<exception>
#include<iostream>
#include<fstream>
#include<zxing/LuminanceSource.h>
#include<zxing/common/Counted.h>
#include<zxing/Reader.h>
父亲节快乐的句子#include<zxing/ReaderException.h>
#include<zxing/Exception.h>
#include<zxing/aztec/AztecReader.h>
#include<zxing/common/GlobalHistogramBinarizer.h>
#include<zxing/common/IllegalArgumentException.h>
#include<zxing/DecodeHints.h>
#include<zxing/BinaryBitmap.h>
#include<zxing/DecodeHints.h>
#include<zxing/datamatrix/DataMatrixReader.h>
#include<zxing/MultiFormatReader.h>
会计 打一成语#include<zxing/pdf417/PDF417Reader.h>
#include<zxing/qrcode/QRCodeReader.h>
#include<zxing/MatSource.h>
using namespace std;
using namespace cv;
using namespace zxing;
using namespace zxing::qrcode;
void displayPicture(const string& winName, cv::Mat inputImage,int waitTime)
新浪微博无法评论{
// 暂时展⽰图⽚
cv::namedWindow(winName, WINDOW_NORMAL);
cv::resizeWindow(winName,800,800);
cv::imshow(winName, inputImage);
cv::waitKey(waitTime);
cv::destroyAllWindows();
}
void help()
{
cout<<"Usage:"<<endl;
cout<<"cvtColor(image, imageHsv, COLOR_BGR2HSV);"<<endl;
国际商务礼仪cout<<"cv::inRange(imageHsv, Scalar(35, 43, 46), Scalar(77, 255, 255), dstHsv);"<<endl;
cout <<"HSV⾊域设置参考:"<< endl;
cout <<"Blue: min: Scalar(100, 43, 46); max: Scalar(124, 255, 255)"<< endl;
cout <<"Green: min: Scalar(35, 43, 46); max: Scalar(77, 255, 255)"<< endl;
cout <<"White: min: Scalar(0, 0, 221); max: Scalar(180, 30, 255)"<< endl;
}
int main()
{
string inputPathDir ="/home/wwh/Documents/myproject/newPipeLocation/test_images/";
string imagePath = inputPathDir +"qr02.png";
const string myWinName ="Show Image";
cv::Mat image = cv::imread(imagePath);
// cv::resize(image, image, Size(115, 100));
// displayPicture("raw image", image, 1000);
演讲技巧cv::Mat matGray;
cv::cvtColor(image, matGray, COLOR_BGR2GRAY);
// 进⾏尝试
try
{
zxing::Ref<zxing::LuminanceSource> source = MatSource::create(matGray);
// int width = source->getWidth();
// int height = source->getHeight();
// fprintf(stderr, "image width: %d, height: %d\n", width, height);
zxing::Ref<zxing::Reader> reader;
zxing::Ref<zxing::Binarizer>binarizer(new zxing::GlobalHistogramBinarizer(source));
zxing::Ref<zxing::BinaryBitmap>bitmap(new zxing::BinaryBitmap(binarizer));
zxing::Ref<zxing::Result>result(reader ->decode(bitmap, zxing::DecodeHints(zxing::DecodeHints::QR_CODE_HINT))); std::string str = result ->getText()->getText();
fprintf(stderr,"recognization result: %s\n", str.c_str());
}
catch(const ReaderException& e)
{
cerr << e.what()<<", no QRCode, ignored"<< endl;
}
displayPicture("en", matGray,1000);
return0;
}
⽅法⼆:使⽤OpenCV⾃带的功能
我发现OpenCV4中已经集成了⼆维码解码的程序了,后⾯有时间再进⾏补充。
参考⽂献(⼤多数好像都没啥⽤就不放了)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论