OpenCV+Zbar扫描二维码
生活随笔
收集整理的這篇文章主要介紹了
OpenCV+Zbar扫描二维码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
之前做了個opencv識別二維碼數(shù)據(jù)上傳云數(shù)據(jù)庫端,雖然后買呢拿掃碼槍做了,還是記錄下,二維碼解碼我用的zbar,zbar解碼出來中文會有亂碼,需要轉(zhuǎn)碼,我找了網(wǎng)上的方法轉(zhuǎn)碼,有的可以轉(zhuǎn)碼成功有的還是亂碼,有知道方法的求告知,這里貼上代碼,因為做了有段時間參考的博客和代碼沒保存下來。
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include <zbar.h> #include <windows.h>using namespace cv; using namespace std; using namespace zbar;void utf8ToGB2312(string utf, string& gb);int main() {zbar::ImageScanner scanner;scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1);Mat QR = imread(“QR.jpg”);Mat imgGray;cvtColor(QR, imgGray, CV_BGR2GRAY); // 灰度化int width = imgGray.cols;int height = imgGray.rows;Image image(width, height, "Y800", imgGray.data, width * height); // 圖片格式轉(zhuǎn)換scanner.scan(image);Image::SymbolIterator symbol = image.symbol_begin();if (image.symbol_begin() == image.symbol_end()){cout << "查詢條碼失敗,請檢查圖片!" << endl;}string symbol_type;string symbol_data;string str1;string gb2312;string gb;for (; symbol != image.symbol_end(); ++symbol){symbol_type = symbol->get_type_name();symbol_data = symbol->get_data();utf8ToGB2312(symbol_data, gb2312);cout << "類型:" << endl << symbol_type << endl << endl;cout << "utf8ToGB2312:" << endl << gb2312 << endl << endl;}waitKey(0);return(0); }void utf8ToGB2312(string utf, string& gb) {//just for windowsint len = MultiByteToWideChar(CP_UTF8, 0, utf.c_str(), -1, NULL, 0);wchar_t* wstr = new wchar_t[len + 1];memset(wstr, 0, len + 1);MultiByteToWideChar(CP_UTF8, 0, utf.c_str(), -1, wstr, len);len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);char* str = new char[len + 1];memset(str, 0, len + 1);WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);if (wstr)delete[] wstr;gb = str;delete[] str; }zbar這個庫很強大,我測試下二維碼旋轉(zhuǎn),二維碼在圖片一個區(qū)域內(nèi)都能解碼成功,除了會有中文亂碼這個缺點。
總結(jié)
以上是生活随笔為你收集整理的OpenCV+Zbar扫描二维码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西藏交通里程明细
- 下一篇: 二年级上册计算题_2015年二年级上册数