臨時更換成了TDM-GCC,和mingw類似,這里只是聲明一下。
由於opencv下載下來的.exe安裝包實際上是沒有mingw(gcc)匹配的/動靜態庫,因此這些東西需要我們自己使用mingw編譯。
首先是cmake配置,直接在source目錄命令行下執行 cmake . 即可(注意后邊有空格和代表當前目錄的點號)
一般來說應該可以了,然后就是使用mingw32-make命令完成編譯(過程較長),最后是使用mingw32-make install 生成需要的文件(頭文件/動/靜態庫)
C:. ├─include │ ├─opencv │ └─opencv2 │ ├─calib3d │ ├─contrib │ ├─core │ ├─features2d │ ├─flann │ ├─gpu │ │ └─device │ │ └─detail │ ├─highgui │ ├─imgproc │ ├─legacy │ ├─ml │ ├─nonfree │ ├─objdetect │ ├─ocl │ ├─photo │ ├─stitching │ │ └─detail │ ├─superres │ ├─ts │ ├─video │ └─videostab └─x86 └─mingw ├─bin └─lib
將bin加入系統path變量中。
2016.1.11更新,由於之前沒有發現這個問題,現在在編譯2.4.11版本的時候,我是用的是最新的支持gcc5.1.0的tdm gcc,在編譯highgui模塊的時候突然產生了這個問題,原始錯誤輸出如下:
C:\opencv\sources\modules\highgui\src\window_w32.cpp: In function 'int icvCreateTrackbar(const char*, const char*, int*, int, CvTrackbarCallback, CvTrackbarCallback2, void*)': C:\opencv\sources\modules\highgui\src\window_w32.cpp:1853:81: error: 'BTNS_AUTOSIZE' was not declared in this scope WS_CHILD | CCS_TOP | TBSTYLE_WRAPABLE | BTNS_AUTOSIZE | BTNS_BUTTON, ^ C:\opencv\sources\modules\highgui\src\window_w32.cpp:1853:97: error: 'BTNS_BUTTON' was not declared in this scope WS_CHILD | CCS_TOP | TBSTYLE_WRAPABLE | BTNS_AUTOSIZE | BTNS_BUTTON, ^ modules\highgui\CMakeFiles\opencv_highgui.dir\build.make:187: recipe for target 'modules/highgui/CMakeFiles/opencv_highgui.dir/src/window_w32.cpp.obj' failed mingw32-make[2]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/src/window_w32.cpp.obj] Error 1 CMakeFiles\Makefile2:2198: recipe for target 'modules/highgui/CMakeFiles/opencv_highgui.dir/all' failed mingw32-make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] Error 2 Makefile:159: recipe for target 'all' failed mingw32-make: *** [all] Error 2
主要就是有幾個變量沒有找到,后來在一個opencv的issues里找到了解答,大概意思就是在mingw的頭文件commctrl.h中,對於上面的變量宏的定義實際上是由_WIN32_IE是否定義來決定的,然而我們找到這個頭文件的時候,他的寫法是這樣:
#include <prsht.h> #ifdef __cplusplus extern "C" { #endif #ifndef _WIN32_IE /* define _WIN32_IE if you really want it */ #if 0 #define _WIN32_IE 0x0300 #endif #endif
看提示我們也知道,默認根本就不可能找到_WIN32_IE這個變量(后來查了一下,這個變量應該是規定所謂的windows的ie瀏覽器版本的變量,不知道怎么和opencv扯上了關系),所以上面那個issues的建議是改成:
#include <prsht.h> #ifdef __cplusplus extern "C" { #endif #ifndef _WIN32_IE /* define _WIN32_IE if you really want it */ #if 1 #define _WIN32_IE 0x0500 #endif #endif
那個0x0500也是我照改的,改完之后我確實能編譯通過了,不知道保持原樣會怎么樣,不過我覺得既然IE版本跟opencv的win32gui沒什么太大的關系,那應該是隨便,只要定義一個就好。總而言之,這個問題暫時算是解決了。另外,由於我下個學期重選了數字圖像處理這門課,我會在學習matlab的同時做opencv的基礎學習的,到時候可能就會重新考量opencv這個庫了,暫時先看2版本的,等熟悉了一點之后再轉用3版本的。
然后是clion的cmakelist.txt編寫如下,這是使用的最簡單的一些庫,稍后也可以自己加入。
cmake_minimum_required(VERSION 3.2) project(opencv) set(CMAKE_CXX_FLAGS "-std=c++11") include_directories(C:\\\\opencv\\\\include) set(SOURCE_FILES main.cpp) set(TARGET_LIBS "C:\\\\opencv\\\\x86\\\\mingw\\\\lib\\\\libopencv_core249.dll.a" "C:\\\\opencv\\\\x86\\\\mingw\\\\lib\\\\libopencv_highgui249.dll.a" "C:\\\\opencv\\\\x86\\\\mingw\\\\lib\\\\libopencv_imgproc249.dll.a" ) add_executable(opencv ${SOURCE_FILES}) target_link_libraries(opencv ${TARGET_LIBS})
然后是編寫測試代碼,
1 #include "iostream" 2 #include<opencv2/opencv.hpp> 3 using namespace std; 4 using namespace cv; 5 6 int main(int argc,char *argv[]) { 7 if(argc!=2){ 8 cout<<"with args in two"<<endl; 9 return -2; 10 } 11 Mat img = imread(argv[1]); 12 if (img.empty()) { 13 cout << "Error" << endl; 14 return -1; 15 } 16 imshow("Lena", img); 17 waitKey(); 18 19 return 0; 20 }
運行參數設置為lena.png
運行一次先產生debug目錄,然后將lena.png轉移到那個目錄去就可以正確看到了: