原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了。
在谷歌和上*查看相关问题解答之后,我下面就介绍Command Line和CMake两种方式。
首先我先粘上我测试的代码吧,文件名为Test.c
#include <highgui.h> int main(int argc,char ** argv) { IplImage* img = cvLoadImage(argv[],CV_LOAD_IMAGE_COLOR);
cvNamedWindow("Image_show",CV_WINDOW_AUTOSIZE);
cvShowImage("Image_show",img);
cvWaitKey();
cvReleaseImage(&img);
cvDestroyWindow("Image_show");
return ;
}
第一种方法:Command Line(使用命令行参数的方法)
gcc Test.c -o Test `pkg-config --cflags --libs opencv`
./Test baboon.jpg
在这里我稍微解释下这条命令的作用吧。
在上面的编译命令中我们其实用到了一个工具“pkg-config”,它主要有以下几个功能:
- 检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
- 获得编译预处理参数,如宏定义,头文件的位置。
- 获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
- 自动加入所依赖的其它库的设置
所有有了这个工具之后我们的编译就很方便了(不过在此之前你要确保你安装的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和上*都没有找到答案,只能自己尝试了,不过还是找到网友给的一些提示。
其实通过它给我们的提示我们就是要设置好这个路径。接下来我们通过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程序的两种方法的更多相关文章
-
她娇羞道“不用这样细致认真的说啊~~”———详细图解在Linux环境中创建运行C程序
她娇羞说,不用这样细致认真的说啊———详细图解在Linux环境中创建运行C程序“不,这是对学习的负责”我认真说到 叮叮叮,停车,让我们看看如何在Linux虚拟机环境中,创建运行C程序 详细图解在Lin ...
-
转:Linux环境下段错误的产生原因及调试方法小结
源地址:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 补充:http://baike.baidu.com/link ...
-
Linux下查看alert日志文件的两种方法
--linux下查看alert日志文件的两种方法: --方法1: SQL> show parameter background_dump_dest; NAME TYPE VALUE ------ ...
-
周一02.3运行python程序的两种方式
一.运行python程序的两种方式 方法一:交互式: 优点:输入一行代码立刻返回结果 缺点:无法永久保存代码 方法二: ...
-
【Jmeter自学】Linux环境下Jmeter运行
==================================================================================================== ...
-
在桌面Linux环境下开发图形界面程序的方案对比
在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...
-
Linux环境下段错误的产生原因及调试方法小结(转)
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...
-
Linux环境下段错误的产生原因及调试方法小结
转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...
-
【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结
本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 1. 段错误是什么 ...
随机推荐
-
[开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫
[DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 上一篇介绍的基本的使用方式,虽然*度很高,但是编写的代码相对还是挺多.于是框 ...
-
MySQL Study之--Mysql无法启动“mysql.host”
MySQL Study之--Mysql无法启动"mysql.host" 系统环境: 操作系统:RedHat EL55 DB Soft: Mysql 5.6.4-m7 通过源代码包 ...
-
Windows常用功能
删除文件或目录CMD命令: rd/s/q 盘符:\某个文件夹 (强制删除文件文件夹和文件夹内所有文件)del/f/s/q 盘符:\文件名 (强制删除文件,文件名必须加文件后缀名)
-
【Swift学习笔记00】——enumeration枚举类型遵循协议protocol
Apple官方文档:The Swift Programming LanguageProtocols and Extensions一节的小节练习,要求自行定义一个enumeration枚举类型,并且遵循 ...
-
huffman树实现的压缩算法,java
1.树的构建 package huffman; public abstract class BinaryTreeBasis { protected TreeNode root; public Bina ...
-
jQuery-mobilevalidate使用 的一些心得,小小总结
在做M站时比较纠结的是表单验证,不像pc端,移动端的验证要求插件更小更轻量,更加灵活,说不定是冒气泡的报错提示?! 介绍一款好用的移动端的表单验证插件:jQuery-mobilevalidate: 代 ...
-
android json 解析简单实例
Android JSON解析跟JAVA 的JSON解析原理是一样的. Android自带的JSON方式跟方便,不需要导包啥的.不深究原理了,直接上代码: public class JsonActivi ...
-
msyql: navicat 连接时msyql遇到的问题
1.使用 mysql的用户,密码连接 服务器上的MySQL时,连接不上,报 100xx的错误. 1)原因是,MySQL默认情况下,只允许本地连接[127.0.0.1,或localhost]来连接mys ...
-
Git 常用的命令
基本内容: 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫stage, 或index.一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有 ...
-
MapReduceV1作业生命周期图解以及与YARN基本对比
仿照<hadoop技术内幕:深入解析MapReduce架构设计与实现原理>中的原图,我用手绘制了一份类似的图-_- 4大部分:HDFS,Client,JobTracker,TaskTrac ...