热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenCVLinux中安装使用OpenCV

转自:http:blog.163.comdingmz_frcmyblogblogstatic217304023201321310532566这里原来是想安装OpenC

转自: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版本,相应的编译过程可以参见
这篇文章:http://www.opencv.org.cn/index.php/%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91
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}/includeName: 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 隔壁那个键。不是单引号‘




推荐阅读
author-avatar
10651s
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有