1. 程式人生 > >opencv+zbar配置實現簡單的二維碼和條形碼識別

opencv+zbar配置實現簡單的二維碼和條形碼識別

目錄

4.效果

5.總結

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.總結

本文描述的是簡單情況下的條形碼和二維碼識別,即不涉及傾斜的二維碼、圖片中有兩個碼等情況,更多複雜情況還得加更多的預處理,比如用仿射變換對傾斜二維碼進行矯正等。