前提
- 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;
}
效果如下: