1. 程式人生 > >c++ 編譯OpenCV-3.3.0過程及遇到的問題

c++ 編譯OpenCV-3.3.0過程及遇到的問題

 

        工作電腦之前用的是vs2013,這是在自己電腦上由於使用比較少,vs下載安裝包太大,平時用eclipse與idea用得也比較習慣,所以就有了這篇文章

平臺:

windows 7 x64

opencv 3.3.0

cmake x64

mingw x64

opencv整合eclipse 安裝CDT外掛支援c++(vscode整合會寫在下一篇)

    

分為四個步驟: 下載檔案與安裝cmake, 再通過cmake生成專案,mingw-make命令編譯opencv原始檔,mingw-install安裝編譯後的專案

 

 

1.   準備工作

 

下載openCV,開啟官網https://opencv.org/releases.html

這裡下載完成後是exe檔案,而不是下載原始碼

下載完成後的檔案:

開啟exe檔案解壓到指定目錄:

安裝CMake

安裝完成後開啟初始介面

安裝mingw ,這裡注意如果系統64位的話,建議安裝64位的,在編譯過程報錯,我最開始下載是32位的,編譯的時候直接報錯了

error: 'thread'in namespace 'std' does not name a type

報是這個報錯,google了半天說是重新安裝就好了

安裝完成cmd看下是否安裝成功

 

 

2.   開始編譯

在x64目錄下新建一個mingw路徑,存入編譯完成的檔案,我放的是D盤下D:\opencv\build\x64\mingw

 

下一步重要,我在編譯到47%就報了這個錯,然後又要重頭開始,浪費了好多時間

完成算下來應該是用了一個半小時,包括出錯重頭開始….

報錯---

sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA錯誤

 

...opencv/sources/modules/videoio/src/cap_dshow.cpp...

...'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' was not declared inthis scope ...

 

解決方式:

在cap_dshow.cpp(目錄在上面) 新增一行:#define NO_DSHOW_STRSAFE

如:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#defineNO_DSHOW_STRSAFE

#include "DShow.h"

 

下一步配置cmake的source  和build就是剛開始解壓的路徑,這裡是D:/opencv/sources,D:/opencv/build/x64/mingw(就是剛才新建的目錄)

點選configrure  再點選generate,

如果以編譯過程中報錯如下:

報錯----

... windres.exe:unknown option – W

 

在生成之前的把headers這裡勾去掉就可以了編譯過去了

 

 

生成之後開啟D:/opencv/build/x64/mingw,開啟cmd命令列視窗輸入:mingw32-make等待到100%即可,如有出錯按上面提示修正.再接著編譯…

最後看到這個,表示已經編譯完成可以使用了

 

3.編譯完成之後,再通過 mingw-make install 安裝編譯後的工程。。。。

 

4.   最後開啟eclipse,新建一個c++專案(前提是已經安裝eclipse的CDT外掛)

在專案屬性,c++build=>setting 下面

最後是顯示結果

 

 

 

int main(int arg,char** args) {

  Mat src,dst;

  string img ="c:\\users\\administrator\\downloads\\t1img.jpg";

  src = imread(img);//圖片地址

  if(!src.data){//data是判斷圖片是存在

     printf("%s\n", "圖片不存在");

     return -1;

  }

  //顯示圖片

  namedWindow("inputimage",CV_WINDOW_AUTOSIZE);

  imshow("inputimage",src);

  waitKey(0);

  cout << "HelloWorld" << endl; //prints Hello World

  return 0;

}