说明:可在安装OpenCV2.1.0的时候一直出现问题(很长时间没得到解决),最后还是选择安装了
OpenCV2.2.0版本!
OpenCV的编译方式有
两种:
1、传统的
./configure ;
make ;
make install,这种方式适用于
OpenCV1.0版本,相应的编译过程可以参见
这篇文章: http://www.opencv.org.cn/index.php/%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91
2、使用
cmake CMakeLists.txt;
make ;
make install,这种方式适用于
OpenCV2.x版本。因此,在编译OpenCV2.X版本之前,需要 先在CentOS上安装 CMake
Linux(CentOS6.3版本)下安装OpenCV2.1.0步骤
-----------------------------------------------------------------------------------
1、下载安装CMake
2、下载安装OpenCV2.2.0
3、使用OpenCV编程
-----------------------------------------------------------------------------------
下载安装CMake2.8.10.2
首先最好创建个
独立的
操作环境(如:
mkdir /software)
下载
Linux(我的环境是
CentOS6.3)版本的cmake: cmake2.8.10.2
安装cmake
$ tar -zxvf cmake-2.8.10.2.tar.gz
$ cd
cmake-2.8.10.2
$ ./bootstrap
$ make
$ sudo make install
$ export PATH=/bin:$PATH
$ cmake --version
---
安装成功!---
-----------------------------------------------------------------------------------
下载安装OpenCV2.1.0
下载OpenCV-2.2.0源码:从 官网选择下载OpenCV2.2版本
,或者直接下载 OpenCV-2.2.0得到:
OpenCV-2.2.0.tar.bz2
安装OpenCV:
1、将下载的OpenCV-2.2.0.tar.bz2源码包copy到一个指定目录下(如~/software/).
2、解压
OpenCV-2.2.0.tar.bz2:
bzip2 -d OpenCV-2.1.0.tar.bz2
tar -xf OpenCV-2.1.0.tar
或者:
tar -xjf OpenCV-2.1.0.tar.bz2
3、#
cd OpenCV-2.2.0
4、#
cmake
CMakeLists.txt (注意和OpenCV2.0版本之前的编译方式不一样)
5、#
make
6、#
make install
-----------------------------------------------------------------------------------
注意:这几部之后也就完成了OpenCV在Linux中的编译安装。
对于OpenCV-2.2.0版本这样是没任何问题的,但是在OpenCV-2.1.0版本的时候却总是出错,不知为何。
说明:OpenCV 会安装在
/usr/local/lib(动态库) 目录和
/usr/local/include/opencv/
-----------------------------------------------------------------------------------
使用OpenCV编程
通过以上只是将OpenCV编译并安装到了CentOS中,在使用这些库和头文件之前还需要对系统的环境进行设置。
现在开始,下面所做的一切都是为了让编译器能够找到程序需要的OpenCV
库文件和头文件,并明确告诉编译器需要使用那些OpenCV的库!
一下过程缺一不可:
-----------------------------------------------------------------------------------
1、环境变量配置 - 注意,这和windows系统下有些不同!
# vim /etc/ld.so.conf
最后一行加入 /usr/local/lib
#
ldconfig
或者
export
LD_LIBRARY_PATH=/usr/local/lib
也就是将编译出来的OpenCV库文件路径加入到
LD_LIBRARY_PATH全局变量中!给编译器指明库所在路径。
2、拷贝opencv.pc文件 - 很关键
将/usr/local/lib/pkg-config中的opencv.pc 拷贝到/usr/lib/pkg-config中,如果不做这步,根本编译不起!
这个文件在windows中使用OpenCV时没见过吧,但在Linux下面这个文件就是关键,这个文件中包含着关于OpenCV共享 库(.so)的很多
使用信息(例如,库文件路径、名称及头文件信息)。OpenCV-2.2.0版本的该文件内容如下:
# Package Information for pkg-config
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.2.0
Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann
Cflags: -I${includedir_old} -I${includedir_new}
此文件中的信息在编译程序时(链接OpenCV库)会用到,被
pkg-config使用!
而,为什么非要将此文件复制到
/usr/lib/pkg-config中也是和
pkg-config
有关联,请见以下内容。
3、 在编译代码时应该使用pkg-config参数
在编译程序代码时(当然是使用了OpenCV共享库)请使用如下格式来链接OpenCV共享库:
-------------------------------------------------------------------------------------------------------
#
g++ `pkg-config opencv --libs --cflags opencv` ./image.cpp -o image
-------------------------------------------------------------------------------------------------------
其中:
./image.cpp即是需要编译的测试程序。
这里详细介绍下
`pkg-config opencv --libs --cflags opencv`
参数的作用:
-----------------------------------------------------------------------------------
其实使用此参数就等于使用了
gcc/g++的CFLAGS参数
,也就是在编译时设置了一些编译选项。例如,当在命令行中执行
# pkg-config opencv --libs --cflags opencv 之后可以看到一下信息:
-I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui
-lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib
-lopencv_legacy -lopencv_flann
你看这不就是我们用gcc编译连接时CFLAGS的参数吗?
因此当我们需要编译连接某个库时,我们只需要把上面那行加入gcc 的参数里面即可。
这样看来就很明白了,其实
`pkg-config opencv --libs --cflags opencv`
就等于在gcc/g++后面添加了这一坨的编译参数罢了!
但是还有个疑问:
pkg-config从哪儿知道这些信息的呢?它是从包名为xxx.pc这个文件中查找到的。拿上面那个例子说,
它是从opencv.pc这个文件中查知的。
那pkg-config 又怎么会知道opencv.pc这个文件呢?
下面我们看一下pkg-config是怎样工作的。
缺省情况下,pkg-config首 先在
prefix/lib/pkgconfig/中查找相关包(譬如opencv)对应的相应的文件
(opencv.pc)。在linux上上述路径名为
/usr/lib/pkconfig/(
现在明白问什么需要将opencv.pc复制到
/usr/lib/pkconfig/中的原因 了吧)。若是没有找到,它也会到
PKG_CONFIG_PATH
这个环境变量所指定的路径下去找。若是没有找到,它就会报 错,例如:
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
-----------------------------------------------------------------------------------
使用实例:- 源文件:image.cpp
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main(int argc, char *argv[])
{
IplImage* image = cvLoadImage("./applog.bmp");
cvNamedWindow("show_image",0);
cvShowImage("show_image",image);
cvWaitKey(0);
cvReleaseImage(&image);
cvDestroyWindow("show_image");
return 0;
}
写完以后,命令行直接:
# g++ `pkg-config opencv --libs --cflags opencv` image.cpp -o image
# ./image
图片显示出来了~OK!!!
PS:以后编译OpenCV程序的命令为:
假设要编译的文件尾test.cpp
g++ -ggdb `pkg-config –cflags opencv` `pkg-config –libs opencv` test.cpp –o test
其中,` 符号是数字 1 隔壁那个键。不是单引号‘