使用CMake + MinGW + Eclipse 开发OpenCV --编译,使用以及可能遇到的问题详解


使用CMake + MinGW + Eclipse 开发OpenCV --编译,使用以及可能遇到的问题详解


1、工具以及平台

1、Windows Vista 以上。注:我已经在Windows 7 ,Windows 8,Windows 8.1上测试通过,还没在最新版的Windows 10上测试,有兴趣的朋友测试下。

2、MinGW。推荐 tdm-gcc-4.8.1 因为tdm-gcc在MinGW的基础上增加了GTK等的部分库的支持,可在官网http://tdm-gcc.tdragon.net/download 下载。特别说明,如果你已经安装了MinGW,可以使用你自己的,如果编译不通过再考虑回来下载安装,注意,安装的时候不能在原MinGW的路径下覆盖安装。

3、Eclipse。配备CDT的Eclipse版本,可以到官网http://www.eclipse.org/downloads/ 下载

4、OpenCV。这里使用的是OpenCV2.4.10 建议下载最新版本的OpenCV进行编译,因为低版本的可能会遇到某些问题,待会我会在第四点的时候详细分析。http://sourceforge.net/projects/opencvlibrary/files/ 其中Win对应的是Windows下的版本。其实Windows下的也可以在Linux编译并运行,相差不大,主要区别在于Win下的包 包含了已经编译好的VC用的库,不打算使用的话可以忽略而下载Linux版本的源码回Windows下编译。

5、其实,我相信搜索到这篇文章的朋友们应该熟悉MinGW以及Eclipse了,现在是希望在OpenCV上踏出第一步。怎么说呢,如果你只用OpenCV来编译C代码的话,可以直接使用已经编译好的VC库,只是拷贝到别人电脑上也得要求安装有相应的VC库,而使用源码的话我们则可以很轻松的进行静态编译从而使得程序具有完整的可执行功能。


2、安装MinGW

1、下载tdm-gcc-4.8.1,使用默认配置安装,(千万记得,bin 一定要添加到系统环境变量,担心出错的话选默认就木事了)

3、编译配置CMake

1、安装CMake,保留默认点击 next 知道安装完成

2、打开CMake,在 source code 位置填入源码路径,在 build 位置填入编译输出的路径,这里我用$BUILD_PATH$表示一会方便表述。


3、然后点击左下角的 Configure 按钮,选择编译工具,由于我们用的是MinGW,因此这里选择 MinGW MakeFiles ,点击 Finish ,如下图


4、等待 Configure ,一般来说选择默认配置就行,对于低版本的 MinGW ,建议不要开启 CPU SSE2 指令加速,会导致编译失败,不过这种情况容易解决,升 级 MinGW 即可。CMAKE_BUILD_TYPE表示编译输出类型,如果用于 Debug 则选择 Debug ,不额外指定的话会输出为 Release 类型,无碍。为加快编译速度,可以取消勾选 BUILD_*_TEST 测试程序,确认后再次点击左下角的 Configure ,等待消去红色,然后再点击旁边的 Generate 按钮输出CMake编译配置文件


5、到输出路径$BUILD_PATH$  下打开命令行或者使用 cd 命令到底该目录下,输入 mingw32-make 不出意外,程序将编译成功,然后再执行 mingw32-make install 安装这里的安装是生成到目录install文件夹下,该文件夹的内容可以移动到别的地方甚至可以给你的朋友使用,我们将用到改文件夹进行开发,其余的可以清理掉以节省磁盘空间。


6、由于我们要用到install目录下的文件,因此需要将编译出来的库加入系统变量,需要加入的目录有 bin 和 lib ,例如,我的是 E:\opencv\release\install\x86\mingw\bin 和 E:\opencv\release\install\x86\mingw\lib。加入的方法是在桌面右键“计算机” → “属性” → “高级系统属性” → “环境变量” → “系统变量”或“用户变量” → “Path” → 粘贴路径。注意,不要删除原有的系统变量,每个路径之间用英文的 ; 隔开,千万注意。。在击确定,在命令行里面输入path看看路径是否已经成功添加,部分反应慢的机器可能需要重启才能生效。


4、编译遇到的问题

1、我相信找到这篇文章的肯定是遇到问题了

2、问题一,编译失败,在编译到30%左右的时候提示 HighGui 模块编译失败,抛出In function 'void cvSetModeWindow_W32(const char*, double)':

这个问题只有2.4.9以下版本才会遇到,从提示可以看出OpenCV的源代码没有定义Win32的头,需要我们自己修改,下面这段是国外论坛上公开的修改方法,非常管用。打开opencv/source/modules/highgui/src/precomp.hpp,然后按提示继续

In modules/highgui/src/precomp.hpp, add the + marked line:

 #if defined WIN32 || defined WINCE
 +    #if !defined _WIN32_WINNT
 +        #ifdef HAVE_MSMF
 +            #define _WIN32_WINNT 0x0600 // Windows Vista
 +        #else
 +            #define _WIN32_WINNT 0x0500 // Windows 2000
 +        #endif
 +    #endif
 +
      #include <windows.h>

And in modules/highgui/src/window_w32.cpp, remove the - marked lines:

 #if defined WIN32 || defined _WIN32

 -#define COMPILE_MULTIMON_STUBS // Required for multi-monitor support
 -#ifndef _MULTIMON_USE_SECURE_CRT
 -#  define _MULTIMON_USE_SECURE_CRT 0 // some MinGW platforms have no strncpy_s
 -#endif
 -
 -#if defined SM_CMONITORS && !defined MONITOR_DEFAULTTONEAREST
 -#  define MONITOR_DEFAULTTONULL       0x00000000
 -#  define MONITOR_DEFAULTTOPRIMARY    0x00000001
 -#  define MONITOR_DEFAULTTONEAREST    0x00000002
 -#  define MONITORINFOF_PRIMARY        0x00000001
 -#endif
 -#ifndef __inout
 -#  define __inout
 -#endif
 -
  #ifdef __GNUC__
  #  pragma GCC diagnostic ignored "-Wmissing-declarations"
  #endif

  #include <commctrl.h>
 -#include <winuser.h>
  #include <stdlib.h>
  #include <string.h>


3、问题二,成功编译,但是测试的时候程序抛出需要安装 GTK 2.x *** 之类

对于这种情况,一般是在 Configure 的时候取消了 WITH_WIN32UI 导致,不需要安装什么GTK 2.x之类,没用的,只需要打开CMake,勾选 WITH_WIN32UI,再点击 Configure 即可

4、问题三,成功编译,但是程序运行时什么都没有,甚至 cout 都没有输出

cout没有输出,证明g++编译出错了,建议清除掉硬盘上原有的 MinGW 然后重新下载 tbb-gcc 安装。

5、问题四,编译失败,提示/3rdparty/lib/libvideoInput.a(videoInput.o):videoInput.cpp:(.text+0xee): undefined reference to`__gxx_personality_sj0'配置编译

问题出在 libvideoInput 这个静态库上,该库是由 Mingw SjLj 编译的,而 Mingw DW2 下不能用。不过谷歌上已经有人编译完成了,可以在这里下载 http://code.google.com/p/pyopencv/downloads/detail?name=libvideoInput.a&can=2&q= 直接拷贝到 ${opencv_root}/3rdparty/lib 下替换掉原来的libvideoInput.a 就行了。

6、问题五,编译失败,提示CMake Error at cmake_install.cmake:119 (FILE): file INSTALL cannot find "opencv_ffmpeg230d.dll.”

问题是OpenCV2.3.0中ffmpeg被放到3rdparty里面去了,替换为OpenCV2.2.0的或者找到文件search008/cmake_install.cmake, 将其中的与opencv_ffmpeg230d.dll有关的语句注释掉

5、使用Eclipse开发

1、点击 File → New → C++ Project 新建一个C++工程,工程名字随便取,这里取test


2、右键工程 test → New → Source File,新建一个cpp文件,在里面键入以下代码(OpenCV2代码,C++类型)

#include <cv.h>
#include <highgui.h>

using namespace cv;

int main(int argc, char** argv) {

	if (argc != 2) {
		std::cout << "Please type 'execname imagefile' to execute." << std::endl;
		return 0;
	}
	Mat image = imread(argv[1]);

	namedWindow("Display Image", CV_WINDOW_AUTOSIZE);
	imshow("Display Image", image);

	waitKey(0);
	return 0;
}

3、你会发现代码报错很多,没关系,那是因为我们还没配置好,右键 test → Properties → C/C++ General → Paths and Symbols → GUN C++,点击右边的 add ,分别把$BUILD_PATH$\install\include,$BUILD_PATH$\install\include\opencv,$BUILD_PATH$\install\include\opencv2 加入到环境变量里面,如有必要,建议GUN C 和Release都加上该路径,小Tips,点击 add 输入路径时,在弹出的窗口中顺手点一下add to all configurations 会省事很多噢。


4、点击 Library Paths,把编译出来的库的所在路径加进去,如果执行过mingw32-make install的话,那么路径就是$BUILD_PATH$\install\x86\mingw\lib,如下图


5、点击 Libraries,把%BUILD_PATH%\install\x86\mingw\bin下的所有dll文件 add 进目录里面,编译完后一共有18个模块,都加进来,加进来的库不要带后缀名,如下图。一个个敲文件名很麻烦的,有一个小Tips就是在该目录下打开命令行,然后键入命令 for %i in (*.dll) do echo %~ni >> ls.txt 命令的意思是将文件夹下所有的dll的文件名输出到 ls.txt 下,打开 ls.txt 一个个剪切粘贴过去即可,在下面我贴出OpenCV2.4.10 Release版本的所有库名字


6、点击确定,稍等片刻,刷新一下将看到错误已经消失了,然后编译,运行,惊喜不。提供的代码的编译程序的正确打开方式是命令行下 test.exe 1.jpg(假设 1.jpg 在同级目录下)


6、如何避免每次新建工程都需要次重新配置

1、相信同一件事重复做是一件非常麻烦的事,其实第一次配置成功的时候就意味着其他工程也不需要如此辛苦的配置了,我们可以提取test工程目录下的.cproject文件备份好,每次新建一个工程的时候将该.cproject粘贴替换进去,刷新即可。别小看这个Tips,想了解为什么的可以用记事本打开看看,^_^




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值