OpenCV - Linux中安装使用OpenCV


转自:http://blog.163.com/dingmz_frcmyblog/blog/static/217304023201321310532566/

这里原来是想安装OpenCV2.1.0的。不选择其他更高的版本,只是因为在一个项目中使用了其他高版本OpenCV中已经废除的类型CvvImage,虽然在高版本中有替换此类型的方法,但是本人需要做的只是将此项目工程从Windows移植到Linux中,不想再修改代码!所以,为了移植性安全还是选择继续使用2.1.0的版本。

说明:可在安装OpenCV2.1.0的时候一直出现问题(很长时间没得到解决),最后还是选择安装了OpenCV2.2.0版本!

OpenCV的编译方式有两种:
1、传统的./configure ; make ; make install,这种方式适用于OpenCV1.0版本,相应的编译过程可以参见
2、使用cmake CMakeLists.txtmake 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 隔壁那个键。不是单引号‘


没有更多推荐了,返回首页