天天看點

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

為了這個配置,我搞了整整兩天。以前用過QT,但沒有配置過OpenCV和 Zbar,中間出了很多問題,在快放棄的時候配置好了。 網上盡管也有不少資料,但是這個網站上很多沒有任何營養的貼子耽誤了太多的時間!

是以,我決心将這個過程全部寫出來,希望能幫助有需要的人,我的系統環境為Win 10 64位。

1 軟體準備

首先需要準備四個軟體:

1.1 Qt+MinGW

開發環境界面QT+編譯器MinGW,下載下傳位址:

http://download.qt.io/archive/qt/5.9/5.9.2/qt-opensource-windows-x86-5.9.2.exe

首次下載下傳qt-opensource版本需要注冊個賬号,比較簡單,郵箱激活即可。

安裝選項配置如下,我們這裡選擇了32位MinGW編譯器,目的是想直接調用zbar安裝包(僅支援32位)

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼
搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

安裝完以後,注意配置一下環境變量:

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼
1.2 OpenCV

用于圖像載入,下載下傳位址:

https://nchc.dl.sourceforge.net/project/opencvlibrary/opencv-win/3.1.0/opencv-3.1.0.exe

這實際上是個壓縮包,我們需要把它解壓一下,解壓以後有兩個檔案夾

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

sources 裡面是源碼,build裡面是opencv官方提供的編譯好的庫和頭檔案,但這裡隻提供用VC環境編譯的64位版本的庫檔案和頭檔案。為了能夠在Qt+MinGW32位編譯環境下使用Opencv還需要進行編譯,是以我們需要在Qt+MinGW32環境下編譯OpenCV的源碼(sources檔案夾). 

1.3 Cmake 

用于編譯32位的OpenCV, 下載下傳位址:

https://github.com/Kitware/CMake/releases/download/v3.17.0-rc2/cmake-3.17.0-rc2-win32-x86.msi

注意安裝時勾選自動配置環境變量,結果如下:

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

實際上,我們完全可以直接在Qt+MinGW32環境下編譯,但是我編譯的時候,出現了opencv_ffmpeg.dll下載下傳不成功的情況,然後我就嘗試用CMake進行編譯, CMake在準備資料時将所需要的庫檔案下載下傳完畢,接着我并沒有在Cmake下編譯,而是關閉Cmake,又回到Qt環境下進行opencv源碼的編譯,因為我找到了一份不錯的介紹參考資料1. 是以,我更偏向這個用QT來編譯而不是Cmake,我将在下一節詳細介紹這個過程。

1.4 Zbar

用于二維碼識别 下載下傳位址:

下載下傳位址:https://nchc.dl.sourceforge.net/project/zbar/zbar/0.10/zbar-0.10-setup.exe 

這個版本也是32位的,注意安裝的時候,注意選擇第三項,開發者頭檔案和庫檔案。

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

安裝完畢以後也要檢查一下環境變量。

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

2 利用Qt編譯OpenCV 

本節分為兩個,2.1節給出如何利用Qt+MinGW編譯OpenCV,如果遇到dll下載下傳不了的問題可以跳轉到2.2節,自動下載下傳相關dll檔案,然後在重新運作2.1節的配置就可以了。

2.1 直接編譯

1 檢查一下在QtCreator下的:選項–建構與運作–CMake–會自動檢測出cmake的程式

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

2 用QTCreator打開工程,就像加載.pro一樣,選擇加載OpenCV源碼中的 CMakeLists.txt檔案,編譯構造配置選擇 Release( Debug版本需要同樣的操作),等待幾分鐘,Qt正在加載 CMakeLists.txt 檔案,可從概要資訊中看到該過程。

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

3. 加載完畢後,需要對配置做一些修改,點選qt最左側的項目頁籤

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

修改配置:

    勾選WITH_OPENGL、WITH_QT

    取消勾選WITH_IPP、WITH_MSMF、ENABLE_PRECOMPILED_HEADERS。

    設定CMAKE_INSTALL_PREFIX一個路徑,這個路徑是編譯完成後的輸出路徑。

    再到建構步驟,詳情中勾選 install。

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

    點選按鈕 Apply Configuration Changes

然後點選QT最左側最下方的Bulid按鈕進行編譯,如果成功,一般需要30-40分鐘,則在install目錄下就會有include和x86兩個檔案夾,一個是頭檔案,一個是庫檔案

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

當然,對很多版本來說會出現一些編譯中的錯誤,最常見的就是:

在編譯到檔案

opencv/sources/modules/videoio/src/cap_dshow.cpp中出錯 error : 

       'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' was not declared in this scope ...

這時我們需要在在opencv的源碼檔案cap_dshow.cpp中添加

#define STRSAFE_NO_DEPRECATE

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

然後重新進行編譯。祝你成功,這裡就完成了一大步,Debug版本一樣編譯。

再次說明,你在qt編譯opencv是提示缺少opencv_ffmpeg.dll 時,請執行2.2.

2.2 利用CMake下載下傳相關dll檔案

打開Cmake,然後在第一行選擇opencv的source檔案夾,在build目錄中配置好編譯路徑,然後點選Configure按鈕,選擇Generator為MinGW Makefiles,

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

選第二項自定義編譯器位置,然後點選完成

接着就會有一陣子載入源碼和下載下傳相關檔案的過程,你最好期待你的網絡速度沒問題,然後就會出現配置完成的界面

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

如果你在cmake也下載下傳不了的話,請參考這篇文章

https://www.cnblogs.com/jerrybaby/p/8295111.html 

或者百度其他類似方法,我并沒遇到這種問題,是以接下來,我并沒有在這裡配置并繼續利用cmake進行編譯,而是回到了QT中用2.1節的方法編譯。

3 在Qt項目中配置OpenCV 

接下來配置Qt中的OpenCV運作環境,Release運作需要Release編譯的,Debug運作需要Debug編譯的。是以,将編譯好的兩個檔案夾的頭檔案include和庫檔案x86儲存好,我把他們分别儲存在C:\opencv\build32\ 和C:\opencv\build32d\中 。

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼
3.1 建立一個Qt Application項目 

我們建立一個Qt Application 來搭建這個環境,我建立的是 OpenCVTest

一行代碼都不用寫,編譯一下,應該不會有問題,隻是彈出一個空白視窗。

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

3.2 配置OpenCV環境變量

由于我編譯了debug和release兩個版本,我把他們都添加到環境變量中

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

需要特别注意的是添加好這些環境變量後,重新啟動電腦一次。

以realse版本為例看一下bin檔案夾的内容,注意這裡面全是dll檔案和exe檔案。

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

3.3 修改工程的.pro檔案

有了庫檔案和頭檔案後,配置opencv環境很簡單,隻需要在 .pro檔案中添加opencv的頭檔案和庫檔案位置

INCLUDEPATH += C:/opencv/build32/include

DEPENDPATH += C:/opencv/build32/include

INCLUDEPATH += C:/opencv/build32d/include

DEPENDPATH += C:/opencv/build32d/include

win32:CONFIG(release, debug|release): LIBS += C:/opencv/build32/x86/mingw/lib/libopencv_*.a

else:win32:CONFIG(debug, debug|release): LIBS += C:/opencv/build32d/x86/mingw/lib/libopencv_*.a

注意這個.pro檔案中添加的的是lib檔案夾,而不是bin檔案夾,我們需要的是dll.a類型的庫檔案,在編譯的時候需要,運作的時候需要windows下的dll檔案

再次強調,添加環境變量後需要重新啟動電腦,否則,盡管我們的.pro檔案配置完全沒有問題,編譯一樣通過,但是運作的時候會出現exe程式異常退出。

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼
4 在Qt中配置Zbar運作環境

由于Zbar的exe安裝包已經包含了庫檔案和頭檔案,Qt中配置Zbar比較簡單,隻需要在pro 檔案中添加Zbar相關檔案

win32: LIBS += 'C:\Program Files (x86)\ZBar\bin\libzbar-0.dll'
INCLUDEPATH += 'C:\Program Files (x86)\ZBar\include'
DEPENDPATH += 'C:\Program Files (x86)\ZBar\include'
      

5 編寫測試代碼

代碼基本流程是利用opencv讀取一個二維碼圖像,然後讓zbar識别,并傳回結果給控制台。在zbar的安裝目錄C:\Program Files (x86)\ZBar\examples 中有一個scan_image.cpp的例子,但這個例子的問題是需要imagemagick這個庫,為了以後一直用opencv,就不用這個庫了,而且估計imagemagick也不必opencv配置起來簡單多少。

#include "mainwindow.h"

#include <QApplication>

#include <iostream>

#include <zbar.h>

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

//#define STR(s) #s

using namespace std;

using namespace zbar;

using namespace cv;

int main(int argc,char*argv[])

{

    //zbar 建立掃描模型并配置

    ImageScanner scanner;

    scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);

    Mat image = imread("E:\\myqrcode.jpg");

    namedWindow("Source Image");

    imshow("Source Image", image);

//    Mat imageGray;

//    cvtColor(image,imageGray,CV_RGB2GRAY); // 對于原本就是灰階圖的圖像而言調用CV_RGB2GRAY會出錯

    //讀取圖像

    Mat imageGray = imread("E:\\myqrcode.jpg",0);  //參數0 ,直接将圖檔讀取為灰階

    //為Zbar建立一個圖像碼對象

    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<<"Bar code query failed, please check the picture!"<<endl;

    }

    for(;symbol != imageZbar.symbol_end();++symbol)

    {

        cout<<"type:"<<endl<<symbol->get_type_name()<<endl<<endl;

        cout<<"bar:"<<endl<<symbol->get_data()<<endl<<endl;

    }

    //展示灰階圖

    imshow("Gray Image",imageGray);

    waitKey();

    //清空圖像碼對象

    imageZbar.set_data(NULL,0);

    return 0;

}

二維碼如下:

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

識别結果如下:

搭建 Qt+MinGW+OpenCV+Zbar 環境詳細配置及二維碼識别 1 軟體準備2 利用Qt編譯OpenCV 3 在Qt項目中配置OpenCV  4 在Qt中配置Zbar運作環境 5 編寫測試代碼

需要注意,包含頭檔案用 <> ,不要用雙引号

由于zbar目前不支援中文,如果要支援中文,需要重新編譯一下,這個可以自行百度,我的目的是整個流程跑跑起來

最後希望能幫到大家節省時間。如有不足請提出,我盡力改進。

參考資料:

https://blog.csdn.net/oBoLuoChuiXue12/article/details/84971985

https://blog.csdn.net/fengxueniu/article/details/77478669?utm_source=blogxgwz7

https://blog.csdn.net/bona020/article/details/69666868