前提
- MinGW
- CMake3.7.1
- OpenCV2.4.13
- Sublime Text 3
碰到一些問題
我用 MinGW 和 CMake 沒有成功編譯OpenCV源碼,但用 mingw-w64 和 CMake 成功編譯了 OpenCV 源碼。能力有限,並不清楚具體怎麼解決。
安裝mingw-w64
首先安裝mingw-w64(我下載的是6.2.0,其他版本並未試過能否成功),下載 mingw-w64;下載完成,解壓文件並重命名爲MinGW,然後配置環境變量,方法與配置MinGW的方法一樣。
例如我的環境變量是
C_INCLUDE_PATH C:\MinGW\include
LIBRARY_PATH C:\MinGW\lib
Path C:\MinGW\bin
如果原本裝有MinGW那就可以直接用mingw-w64替換。他們2個的功能都是一樣的。
注意:需要重啓電腦刷新環境變量,也可以自行百度不重啓刷新環境變量的方法。
然後在命令行輸入gcc --version
,以確定環境變量是否可用
如圖,則配置成功。
下載OpenCV
我下載的OpenCV版本是2.4.13,訪問官網 http://opencv.org/ 自行下載。雖然下載的是exe文件,其實只做瞭解壓工作,解壓到目標文件夾。子目錄應該有 build 和 sources 2個文件夾。
下載和安裝CMake
我下載的CMake版本是3.7.1,訪問官網 https://cmake.org/ 自行下載,下載並安裝。
編譯OpenCV源碼
運行CMake,source code 選 解壓文件下的sources文件夾,輸出到 build/x64/mingw 這是我們以後要用的文件夾。
我因爲之前編譯過,所以會有紅色的這部分。
點 Configure
next
gcc 選 MinGW/bin/x86_64-w64-mingw32-gcc.exe
g++ 選 MinGW/bin/x86_64-w64-mingw32-g++.exe
完成後,再次點擊configure。
需要耐心等進度條完成。完成後 我的輸出框裏 有CPACK_PACKAGE_VERSION does not match version provided by version.hpp 的提示,但發現這個問題不大。
然後點Generate生成,等待完成。
然後使用命令行進入輸出文件夾 build/x64/mingw 下輸入 mingw32-make
運行
然後就進入漫長的等待,我的電腦大概用了近一個小時(電腦太差了!)
等待完成。根據你自己的路徑,將 C:\opencv\build\x64\mingw\bin
加入 Path
加入環境變量。
在sublime text 3 中 新建編譯環境OpenCV.sublime-build
{
"cmd": ["g++", "${file}", "-o", "${file_path}/${file_base_name}",
"-I", "C:/opencv/build/include",
"-I", "C:/opencv/build/include/opencv",
"-I", "C:/opencv/build/include/opencv2",
"-L", "C:/opencv/build/x64/mingw/lib",
"-l", "opencv_core2413", "-l", "opencv_imgproc2413", "-l", "opencv_calib3d2413","-l","opencv_objdetect2413",
"-l", "opencv_video2413", "-l", "opencv_features2d2413", "-l", "opencv_ml2413", "-l", "opencv_highgui2413",
"-l", "opencv_legacy2413" ],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++, source.cpp",
"encoding": "gbk",
"variants":
[
{
"name": "Run",
"cmd" : ["${file_path}/${file_base_name}"]
}
]
}
新建opencv程序測試
測試程序 test.cpp ,讀取並顯示圖片。
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
const char* imagename = "d:/a1.jpg";
//從文件中讀入圖像
Mat img = imread(imagename);
//如果讀入圖像失敗
if(img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
//顯示圖像
imshow("image", img);
//此函數等待按鍵,按鍵盤任意鍵就返回
waitKey();
return 0;
}
效果如下: