在linux环境下编译运行OpenCV程序的两种方法 - woshijpfgg
原来以为在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”,它主要有以下几个功能:
- 检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
- 获得编译预处理参数,如宏定义,头文件的位置。
- 获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
- 自动加入所依赖的其它库的设置
所有有了这个工具之后我们的编译就很方便了( 不过在此之前你要确保你安装的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程序的两种方法 - woshijpfgg相关推荐
- linux系统下编译运行C++程序
前提 首先linux系统下要有C++编译环境.可以使用 which gcc which g++ 查看linux系统下是否安装GNU编译器. 编写代码 使用vim命令打开编辑器编写代码 先写一个最简单的 ...
- 浏览器运行java的方法_通过浏览器运行java程序的两种方法
方法一:Applet技术 现在有一个application,要把它转换成Applet. 首先,用eclipse打开这个项目. 然后找到要改的java类,让这个类继承Applet类或者JApplet类. ...
- Linux下编译运行C程序
代码变成可执行文件叫做编译(compile):先编译这个还是先编译那个这个(即编译的安排)叫做构建(build) 我们在Linux环境下编译C语言需要gcc. 1.配置GCC 刚装好的系统已经有GCC ...
- Linux环境下编译并执行ava helloworld程序
http://blog.lupaworld.com/home-space-uid-24466-do-blog-id-2578.html 已经学会怎样在Windows下怎样编辑,编译和运行Java程序了 ...
- NDK实践(一)在linux环境下编译ffmpe
系列文章目录: NDK实践(一)在linux环境下编译ffmpe NDK实践(二)将编译的ffmpeg静态库集成到Android工程 最近开始接触学习ndk开发,本着边学习边实践的原则,计划完成视频编 ...
- linux环境下编译部署php生产环境
linux环境下编译部署php生产环境 版本控制 php:7.2.4 nginx:1.9.9 部分插件版本 xlswriter:1.3.3.2 redis:3.1.3 一.安装php 1.安装依赖(之 ...
- 转Linux环境下段错误的产生原因及调试方法小结
Linux环境下段错误的产生原因及调试方法小结 转载于:https://www.cnblogs.com/objectDetect/p/7575659.html
- linux升级网卡fw,一种linux环境下覆盖多品牌硬盘的FW升级方法与流程
本发明属于服务器硬盘升级技术领域,具体涉及一种linux环境下覆盖多品牌硬盘的FW升级方法. 背景技术: 随着浪潮服务器的不断发展和壮大,作为国内最大的服务器供应商,服务器市场已经囊括各个领域,客户对 ...
- 运行python程序的两种方式交互式和文件式_教你如何编写、保存与运行 Python 程序...
第一步 接下来我们将看见如何在 Python 中运行一个传统的"Hello World"程序.Python教程本章将会教你如何编写.保存与运行 Python 程序. 通过 Pyth ...
- 在生产环境下处理EFCore数据库迁移的五种方法
在生产环境下处理EFCore数据库迁移的五种方法 原文链接:https://www.thereformedprogrammer.net/handling-entity-framework-core-d ...
最新文章
- 【错误记录】OD 调试器附加进程时找不到进程 ( CE 工具可以附加进程 )
- 使用snmp4j实现Snmp功能(二)
- 209. Minimum Size Subarray Sum 长度最小的子数组
- php.ini中Magic_Quotes_Gpc开关设置
- 动态分区分配算法代码_【代码】巩敦卫等TEVC论文:基于区间相似度分析的协同动态区间多目标进化优化算法...
- 不劳烦苹果了!现在,FBI让嫌疑人抬头刷脸就能解锁iPhone
- CentOS6.7 mysql 主从配置
- FOSRestBundle功能包:使用指南
- redies成神之路
- 地图索引文件MXD保存到数据库中
- c语言身高和标准体重,c语言4-15 输出标准身高体重对照表
- 修改mysql wait timeout_MySQL wait_timeout参数修改
- Combo( 自定义下拉框) 组件
- Word 项目文档排版
- [数据结构]线性表——顺序存储
- Spring-AOP 增强(Advice)5种类型和创建增强类
- ubuntu 录屏软件
- 阿里云服务器购买及SSH免密登录
- 如何将APE及FLAC格式文件刻录成CD
- pte模拟考试_PTE考试题型详解
热门文章
- JavaScript常用算法 1
- Unix编程之size_t、ssize_t
- AIX下使用xmanager
- 強化 Python 在 Vim 裡的顏色 ,参考此文终于第一次搞好color schema了,感谢作者,样式好看...
- 迁移 Linux 系统,第 1 部分——如何迁移备份和裸机恢复 Linux 系统
- 动态SQL和PL/SQL的EXECUTE IMMEDIATE选项
- Navicat - 导入CSV注意事项
- restful接口的设计规范
- 区块链软件公司:智媒链在数据分析和开发应用场景
- 前端每日实战:91# 视频演示如何用纯 CSS 创作一个行驶中的火车 loader