開發環境;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)