zbar解析二维码demo
2024-09-01 03:36:30
开发环境;ubuntu 18.04
IDE:clion 2019
源文件.cpp
#include <opencv2/opencv.hpp>
#include <zbar.h> using namespace cv;
using namespace std;
using namespace zbar; typedef struct
{
string type;
string data;
vector <Point> location;
} decodedObject; // 查找和解码条形码和二维码
void decode(Mat &im, vector<decodedObject>&decodedObjects)
{ // 创建ZBAR扫描器
ImageScanner scanner; // 配置扫描器
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1); // 将图像转换为灰度
Mat imGray;
cvtColor(im, imGray, COLOR_BGR2GRAY);
imshow("gray",imGray);
// 在ZBAR图像中包装图像数据
Image image(im.cols, im.rows, "Y800", (uchar *)imGray.data, im.cols * im.rows); // 扫描图像中的条形码和二维码
int n = scanner.scan(image); // 打印输出结果
for (Image::SymbolIterator symbol = image.symbol_begin(); symbol != image.symbol_end(); ++symbol)
{
decodedObject obj; obj.type = symbol->get_type_name();
obj.data = symbol->get_data(); // Print type and data
cout << "Type : " << obj.type << endl;
cout << "Data : " << obj.data << endl << endl; // Obtain location
for (int i = 0; i < symbol->get_location_size(); i++)
{
obj.location.push_back(Point(symbol->get_location_x(i), symbol->get_location_y(i)));
} decodedObjects.push_back(obj);
}
} // 显示条形码和二维码位置
void display(Mat &im, vector<decodedObject>&decodedObjects)
{
// 循环所有解码对象
for (int i = 0; i < decodedObjects.size(); i++)
{
vector<Point> points = decodedObjects[i].location;
vector<Point> hull; // 如果这些点不形成四边形,则找到凸包。
if (points.size() > 4)
convexHull(points, hull);
else
hull = points; // 凸包中的点数
int n = hull.size(); for (int j = 0; j < n; j++)
{
line(im, hull[j], hull[(j + 1) % n], Scalar(255, 0, 0), 3);
} } // 显示结果
imshow("Results", im);
waitKey(0); } int main(int argc, char* argv[])
{ // Read image
Mat im = imread("/home/leoxae/图片/qrcode2.png"); // Variable for decoded objects
vector<decodedObject> decodedObjects; // Find and decode barcodes and QR codes
decode(im, decodedObjects); // Display location
display(im, decodedObjects);
waitKey(0);
return 0;
}
cmakelist配置
cmake_minimum_required(VERSION 3.14)
project(QRcode) set(CMAKE_CXX_STANDARD 14) add_executable(QRcode main.cpp) #找到opencv的包
set(TARGET_LIBS "/usr/local/include/opencv4/opencv2/")
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} ) #zbar
set(zbar_include_dir "/usr/local/include")
set(zbar_link_dir "/usr/local/lib") include_directories(${zbar_include_dir})
link_directories(${zbar_link_dir})
link_libraries(zbar) #jsoncpp
set(jsoncpp_include_dir "/home/leoxae/apps/jsoncpp/1.8.4/include")
set(jsoncpp_link_dir "/home/leoxae/apps/jsoncpp/1.8.4/lib") include_directories(${jsoncpp_include_dir})
link_directories(${jsoncpp_link_dir})
link_libraries(jsoncpp) #动态链接
#target_link_libraries(pedestrian_detection ${OpenCV_LIBS} )
target_link_libraries(QRcode ${OpenCV_LIBS} )
target_link_libraries(QRcode jsoncpp)
target_link_libraries(QRcode zbar)
最新文章
- 11月13日上午ajax返回数据类型为JSON数据的处理
- sed
- background复合属性详解(上):background-image
- mysql 连接空闲超8小时自动断开连接问题(linux)
- 网络编程:Http通信与Socket通信
- Jmeter使用指南
- HW3.1
- Managed Switch: Confs
- C# Task 源代码(2)
- shell之参数传递
- WPF 绑定密码
- 是否可能两个ETH私钥对应同一个地址
- vuepress 学习心得
- 把多个字符串里面的项写到不同的对象中,然后在push到一个数组中
- adb is down 的解决方法
- 数据库管理系统的ACID特性
- 使用axios实现上传图片进度条
- Java Mongodbjar包下载网址
- iperf 指令
- 这两天对OKR简单总结
热门文章
- navicate连接Mysql5.7时,显示Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES) 错误
- nodejs-Child Process模块
- Sharding-JDBC 实现水平分库分表
- Oracle之DBMS_LOCK包用法详解
- 【Linux】【Services】【SaaS】Docker+kubernetes(1. 基础概念与架构图)
- pipeline 步骤
- 离散数学3.1&;&;3.3
- iOS-启动项目(一)设置 rootViewController
- 【教程】OBS直播推流教程(Windows &; macOS)
- JuiceFS 数据加密原理