在linux环境下编译运行OpenCV程序的两种方法

  原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了。

  在谷歌和上StackOverFlow查看相关问题解答之后,我下面就介绍Command Line和CMake两种方式。

  首先我先粘上我测试的代码吧,文件名为Test.c

 1 #include <highgui.h>
 2
 3 int main(int argc,char ** argv) {
 4
 5     IplImage* img = cvLoadImage(argv[1],CV_LOAD_IMAGE_COLOR);
 6     cvNamedWindow("Image_show",CV_WINDOW_AUTOSIZE);
 7     cvShowImage("Image_show",img);
 8     cvWaitKey(0);
 9     cvReleaseImage(&img);
10     cvDestroyWindow("Image_show");
11     return 0;
12 }

  第一种方法:Command Line(使用命令行参数的方法)

gcc Test.c -o Test `pkg-config --cflags --libs opencv`./Test baboon.jpg

  在这里我稍微解释下这条命令的作用吧。

  在上面的编译命令中我们其实用到了一个工具“pkg-config”,它主要有以下几个功能:

  1. 检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
  2. 获得编译预处理参数,如宏定义,头文件的位置。
  3. 获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
  4. 自动加入所依赖的其它库的设置

  所有有了这个工具之后我们的编译就很方便了(不过在此之前你要确保你安装的OpenCV的安装链接库文件的目录下有一个pkgconfig文件夹,在该文件夹里面有个opencv.pc的文件,其实这就是pkg-config下OpenCV的配置文件)。

  使用pkg-config时,选项--cflags 它是用来指定程序在编译时所需要头文件所在的目录,选项 --libs则是指定程序在链接时所需要的动态链接库的目录。例如我下面这张图就显示了我电脑上OpenCV的相关目录。

  

  

  第二种方法:使用OpenCV推荐的CMake工具

  这个方法,我郁闷了很久,试了各种办法,最终还是编译运行成功啦。一把心酸泪啊。

  下面我就一步步介绍下步骤吧:

  step1:新建一个目录用于存放我们的代码和程序中要处理的相关图片

  

  step2:添加cmake工具编译时所需的文件CMakeLists.txt

  

  CMakeLists.txt文件中的具体内容如下(注:这个文件你可以到你的OpenCV源代码解压出来的文件夹下的/samples/c/example_cmake/文件夹下拷过来,然后再做修改)。

  下面我就简要的介绍下这里面内容的大概意思吧

PROJECT(OpenCV_Example)           //这是建立一个工程项目(类似于我们VS中建立C++项目一样),括号里面时工程名,工程名我们可以任意给,最后程序编译出来的可执行文件就是这个名字
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)    //这是对CMake工具最低版本要求,这里我们要检查下我们的CMake工具的版本信息,我们可以使用命令“cmake --version”查看
if(COMMAND cmake_policy)            
      cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)

FIND_PACKAGE( OpenCV REQUIRED )   //这是cmake用来查找opencv包用的,不用改

# Declare the target (an executable)
ADD_EXECUTABLE(OpenCV_Example  Image_show.c)      //这里括号里面的两个参数分别是工程项目名和我们要编译文件名的意思,记住中间一空格键隔开

TARGET_LINK_LIBRARIES(OpenCV_Example ${OpenCV_LIBS})  //这是我们链接到OpenCV库的环节,我们只要更改前面第一个参数位我们的工程项目名即可

#MESSAGE(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}")     //好了,就修改这么点东西,保存,关闭。

  然后我们就将终端的工作目录切换到我们建立工程文件的这个目录

  (注意,千万要注意:你这时一定要查看你安装OpenCV时建立的那个编译文件,有没有带锁的标志(即你编译OpenCV是用root权限编译的),就这点就把我坑惨了,例如的我电脑上显示的就是这样的

  看到上面图片中的build文件夹没,那就是我编译OpenCV源代码时建立的文件夹。)

  所以,如果你是以root的权限编译的OpenCV此时你就要以切换到root用户,再切换到当前的工作目录。如果不是用root权限编译的OpenCV编译的话,你就直接切换目录就OK了。

  我的电脑是要切换到root状态的

  

  Step3:让后我们输入命令"cmake ."对当前的工程进行编译。啊哦,这时你就会发现你编译时出现了一个Bug

  

  这个警告的大概意思就是:Cmake找不到OpenCV的链接库文件,你需要手动地设置OpenCV_DIR来指向包含库文件的路径。

  好吧,这是最蛋疼的地方,就这个问题我google和上StackOverFlow都没有找到答案,只能自己尝试了,不过还是找到网友给的一些提示。

  其实通过它给我们的提示我们就是要设置好这个路径。接下来我们通过camke的qt界面进行设置吧。

  

  Step4:设置OpenCV_DIR

  (1)先安装cmake的qt界面 "sudo apt-get install cmake-gui"

  (2)打开cmake-gui界面

    

  (3)我们这是就在Where is the source code 和 where to build binaries 的选项里选择我们的目录刚才建立包含我们程序的文件路径吧。

    

  (4)我们选择cmake界面中的“Add Entry”选项,按照我下面图中的方式输入信息吧,其中alue值就是我OpenCV安装的那个目录(回想下我上面说的)。

    

    这样我们就点击ok吧,得到下面的图了

    

    到此OpenCV_DIR就配置完成了,单击下面的Configure和Generate,如果没报错则一切搞定啦。我们可以愉快的回到终端编译我们的程序啦。

  (5)编译的方式如图所示

   

   看到了吗,绿色OpenCV_Example就是我们刚生成的可执行文件,到此大功告成啊。

  

   Step5:运行测试吧

  

  好了,搞定啦,睡觉啦!

  转载请注明出处:http://www.cnblogs.com/woshijpf/

  

    

  

在linux环境下编译运行OpenCV程序的两种方法

时间: 2024-10-10 01:59:18

在linux环境下编译运行OpenCV程序的两种方法的相关文章

linux环境下编译运行OpenCV程序的两种方法

一.命令行Command Line 1 g++ opencv_test.cpp -o opencv_test `pkg-config --cflags --libs opencv` 2 ./opencv_test test.jpg 备注:pkg-config选项--cflags 它是用来指定程序在编译时所需要头文件所在的目录--libs 则是指定程序在链接时所需要的动态链接库的目录 二.CMake工具编译 在程序同目录下创建CMakeLists.txt 1 #文件地址(下载源码安装包中):/op

在虚拟机linux环境下编译windows版adb fastboot

原文出自:http://blog.chinaunix.net/uid-20546441-id-1746200.html 我根据虚拟机编译遇到的问题进行一些添加 [前提条件] Linux Android源码完整 虚拟机磁盘空间100G左右(60G用来存放代码和编译后的文件) swap 30G左右,若太小会导致在编译后提示缺失文件 [具体步骤] 理论上,只要下一个windows版本的SDK,里面就自带了fastboot和adb工具. 但我最近确实遇到了一个需要在linux下编译出windows版本的

linux系统下php安装mbstring扩展的二种方法

.执行 复制代码代码如下: yum install php-mbstring 2. 修改php.ini (这一步非常重要, 部分lxadmin版本无法自动修改) 复制代码代码如下: echo ‘extension=mbstring.so' >>/etc/php.ini #更具php安装目录而定 3. 重启web service 如果是apache: service httpd restart 方法二:php 5.36安装目录:/usr/local/php 复制代码代码如下: #cd /usr/

HTTPS的证书未经权威机构认证的情况下,访问HTTPS站点的两种方法

注意一下文章中提到的jsse在jdk1.4以后已经集成了,不必纠结. 摘 要 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易地编程实现对HTTPS站点的访问.但是,如果该站点的证书未经权威机构的验证,JSSE将拒绝信任该证书从而不能访问HTTPS站点.本文在简要介绍JSSE的基础上提出了两种解决该问题的方法. 引言 过去的十几年,网络上已经积累了大量的Web应用.如今,无论是整合原有的Web应用系统,还是进行新的Web开发,都要求通过编程来访问某些Web页面.传统的方法是使

linux环境下编译带中文的java源文件unmappable character for encoding UTF8

添加-encoding gbk即可编译成功 javac -encoding gbk -cp .:activemq-all-5.11.1.jar  JMSConsumer.java linux下独立运行java程序 http://os.51cto.com/art/201104/256055.htm

Linux环境下段错误的产生原因及调试方法小结(转)

最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况.这里贴一个对于“段

Linux环境下段错误的产生原因及调试方法小结

最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况.这里贴一个对于“段错

【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结

本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误

Linux环境下段错误的产生原因及调试方法小结(转载)

转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间 最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超