opencv+zbar配置實現簡單的二維碼和條形碼識別
目錄
0.準備工作
0.1我的實驗配置:
win10+VS2015community+opencv2.4+zbar0.10
0.2資源下載:
0.2新建專案:
在vs中新建一個空專案,名字自己取一個。
1.opencv配置
執行exe檔案,實質解壓操作,不用新建目錄,因為會解壓後就是一個opencv目錄,記住opencv的路徑,接下來就是環境配置。
1.1 include檔案配置:
在"專案"——>"屬性"——>"屬性"——>"配置屬性"——>"專案屬性"——>"VC++目錄"——>"包含目錄"中新增:
"你的安裝路徑"\opencv\build\include "你的安裝路徑"\opencv\build\include\opencv "你的安裝路徑"\opencv\build\include\opencv2
注意:這裡有三個路徑,路徑要改成你自己opencv的安裝路徑,我的是在C盤根目錄下,我的配置如下:
C:\opencv\build\include
C:\opencv\build\include\opencv
C:\opencv\build\include\opencv2
1.2 lib檔案:
(1)在"專案"——>"屬性"——>"屬性"——>"配置屬性"——>"VC++目錄"——>"庫目錄"中新增:
"你的安裝路徑"\opencv\build\x86\vc12\lib
注意:此處路徑中x86可以改為x64,主要看你vs專案配置的屬性,vc12也可以改為其他版本,如vc11等,最好用最新的版本,但是要檢視一下目錄中存不存在,不能新增不存在的路徑。我的配置如下:
C:\opencv\build\x86\vc12\lib
(2)在"專案"——>"屬性"——>"屬性"——>"配置屬性"——>"VC++目錄"——>"連結器"——>"輸入"——>"附加依賴項"中新增:
新增你的lib路徑下"你的安裝路徑"\opencv\build\x86\vc12\lib的所有lib檔案的名字
注意:lib檔案同名的有兩種,一種是.lib,一種是d.lib,帶d的是DEBUG模式下的版本,只有新增一種就行了,我的vs屬性配置為debug,所以我是配置為:
opencv_calib3d2410d.lib opencv_contrib2410d.lib opencv_core2410d.lib opencv_features2d2410d.lib opencv_flann2410d.lib opencv_gpu2410d.lib opencv_highgui2410d.lib opencv_imgproc2410d.lib opencv_legacy2410d.lib opencv_ml2410d.lib opencv_nonfree2410d.lib opencv_objdetect2410d.lib opencv_ocl2410d.lib opencv_photo2410d.lib opencv_stitching2410d.lib opencv_superres2410d.lib opencv_ts2410d.lib opencv_video2410d.lib opencv_videostab2410d.lib
如果是release模式,配置應該為:
opencv_calib3d2410.lib
opencv_contrib2410.lib
opencv_core2410.lib
opencv_features2d2410.lib
opencv_flann2410.lib
opencv_gpu2410.lib
opencv_highgui2410.lib
opencv_imgproc2410.lib
opencv_legacy2410.lib
opencv_ml2410.lib
opencv_nonfree2410.lib
opencv_objdetect2410.lib
opencv_ocl2410.lib
opencv_photo2410.lib
opencv_stitching2410.lib
opencv_superres2410.lib
opencv_ts2410.lib
opencv_video2410.lib
opencv_videostab2410.lib
2.zbar配置
2.1include檔案:
在"專案"——>"屬性"——>"屬性"——>"配置屬性"——>"專案屬性"——>"VC++目錄"——>"包含目錄"中新增:
"你的安裝路徑"\ZBar\include
我的配置為:
C:\Program Files (x86)\ZBar\include
2.2lib檔案:
在"專案"——>"屬性"——>"屬性"——>"配置屬性"——>"VC++目錄"——>"庫目錄"中新增:
"你的安裝路徑"\ZBar\lib
我的配置為:
C:\Program Files (x86)\ZBar\lib
在"專案"——>"屬性"——>"屬性"——>"配置屬性"——>"VC++目錄"——>"連結器"——>"輸入"——>"附加依賴項"中新增:
libzbar-0.lib
3.程式碼實現
在專案中的main()函式中新增一面的程式碼,並把圖片路徑修改成自己的。
#include<core/core.hpp>
#include<highgui/highgui.hpp>
#include "zbar.h"
#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace std;
using namespace zbar; //新增zbar名稱空間
using namespace cv;
int main(int argc, char*argv[])
{
//定義掃描器
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
//載入圖片
Mat image = imread("qrcode.jpg");//請更改圖片,可以使用據對路徑或相對路徑
if (!image.data)
{
cout << "請確認圖片" << endl;
system("pause");
return 0;
}
//圖片轉換
Mat imageGray;
cvtColor(image, imageGray, CV_RGB2GRAY);
int width = imageGray.cols;
int height = imageGray.rows;
uchar *raw = (uchar *)imageGray.data;
Image imageZbar(width, height, "Y800", raw, width * height);
scanner.scan(imageZbar); //掃描條碼
Image::SymbolIterator symbol = imageZbar.symbol_begin();
//掃描結果列印
if (imageZbar.symbol_begin() == imageZbar.symbol_end())
{
cout << "查詢條碼失敗,請檢查圖片!" << endl;
}
for (; symbol != imageZbar.symbol_end(); ++symbol)
{
cout << "型別:" << endl << symbol->get_type_name() << endl << endl;
cout << "條碼:" << endl << symbol->get_data() << endl << endl;
}
//顯示二維碼
imshow("Source Image", image);
waitKey();
imageZbar.set_data(NULL, 0);//清除快取
return 0;
}
4.效果
4.1二維碼識別效果
4.2條形碼別效果
5.總結
本文描述的是簡單情況下的條形碼和二維碼識別,即不涉及傾斜的二維碼、圖片中有兩個碼等情況,更多複雜情況還得加更多的預處理,比如用仿射變換對傾斜二維碼進行矯正等。