在cmakelists和makefile中设置opencv
1. 查询电脑上的opencv版本:
pkg-config --modversion opencv
2. 在电脑上安装多个版本的opencv,可以通过指定安装路径进行设置:
下载源码后进入文件夹,打开终端;
mkdir build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4
#CMAKE_BUILD_TYPE 确定了编译类型,是release还是debug,一般release比较常用, ubuntu下就是.so库,但是window下会有dll和lib之分;
#CMAKE_INSTALL_PREFIX 安装路径前缀, 确定了这个路径后,make install的opencv 的includepath 和lib等都会安装在这个文件夹下;
make -j4
sudo make install
接下来opencv就安装到/usr/local/opencv3.4下的文件夹中,可以按照这个路径查看你的opencv是否安装成功;
同理,也可以使用这种方法安装其他版本的opencv,只要将安装路径的prefix修改即可
3. 使用不同版本的opencv
如果想要在你的project中调用opencv库,个人觉得比较方便的还是CMakeLists文件,也有可能是因为用的比较多;
如果只有一个版本的opencv,我们一般直接使用:
FIND_PACKAGE(OpenCV REQUIRED)
这种情况适用于只有一个版本的opencv,安装在默认路径下,一般是/usr/local/lib下,比如我的opencv2.4.13, 因为安装的时候如果不指定prefix路径,那么在make install 时会将所有的 .so 文件安装在 /usr/local/lib 下,所有的头文件安装在/usr/include下
但是这里我们对opencv3.4的安装指定了路径,所以,如果想要使用opencv3.4,则需要在find_package之前设定cmake的查找路径:
set(CMAKE_PREFIX_PATH "/usr/local/opencv3.4")
也就是让cmake去这里找opencv;
这里需要赘述的是,find_package 其实寻找的是OpenCVConfig.cmake文件,打开这个文件就能看到当前opencv所对应的版本,同时也对一些路径进行了定义,类似于c++中的宏的感觉,尤其是:OpenCV_LIBS OpenCV_INCLUDE_DIRS 两个路径,这就保证了cmake可以正常找到opencv所需要的头文件和库文件;
因此也就有了第三种包含opencv的方法,就是直接设定这两个路径:
set(OpenCV_DIR "/usr/local/opencv3.4/share/OpenCV")
find_package(OpenCV 3.4 REQUIRED COMPONENTS core highgui imgproc flann calib3d)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
然后将${OpenCV_INCLUDE_DIRS} 和 ${OpenCV_LIBS} 分别添加到 include_directories 和 target_link_libraries中即可;
白巧克力的在cmakelists中设定opencv: https://blog.csdn.net/heyijia0327/article/details/54575245
另外还有一种方法即设定makefile, 其实cmakelist的目的也是为了生成makefile, 然后进行编译,因此,我们也可以跳过cmakelist,直接写makefile文件,这里说一下如何在makefile中包含指定路径的opencv:
这里的设定也有两种方法,第一种是指定INCLUDE 和lib 的路径后进行链接,如下:
#这里需要根据自己在linux上配置的opencv路径修改
INCLUDES = -I/usr/local/opencv3.4/include/opencv #INCLUDES 指定了头文件的路径
LIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml # LIBS 指定了需要哪些库
LIBDIRS = -L/usr/local/opencv3.4//lib #LIBDIRS 指定了需要的库的路径
OPT = -O3 -Wno-deprecated
CC=g++ # 使用g++进行编译
.PHONY: all clean #说明 all 和clean 两个目标文件都是伪目标文件 主要是为了节省命令,每次自动指定test2目标的生成
OBJS= test2.o
clean: # 伪目标cleam, 这两句话主要是为了清除掉所有的依赖库 .o 文件,以及 可执行文件 test2rm -f *.o *~ test2
all:test2 echo all:make complete%.o:%.cpp # 这两句话表示 库test.o 是依赖于 文件test.cpp 的$(CC) -c $(INCLUDES) $+ $(OPT) #要生成.o 库,需要利用g++ 进行编译,同时包含 INCLUDES 这个变量所指定的头文件,OPT指定的一些生成库时的优化选项test2:$(OBJS) # 这时已经生成了一个 test.o的 依赖库, 接下来需要生成一个叫做test2的可执行文件$(CC) $(LIBDIRS) $(LIBS) -o $@ $+ $(OPT) # 同理,也需要用g++进行编译,然后需要链接到test.o的库, $@ 其实表示所有的目标集,也就是.o文件,本例中只有test.o
makefile的文件来源于博客 https://blog.csdn.net/pbypby1987/article/details/18969441, 博客给了例子,没有详细的讲解,这里赘述一下;
更详细的makefile的语法可以参考陈浩博士的 跟我一起学makefile系列,很详细也很清晰;
上面的例子是自己的新建,比较简短,只包含了opencv,且目标文件也比较少,当目标文件比较多 或这需要的库也比较多时,可以利用pkg-config来进行设置;
首先来说一下具体的设置步骤,然后再来说一下这其中的包含关系以及为什么要这么设定:
还是以自定义安装路径为例,如果非自定义,一般会安装在/usr/local/lib下,将对应的路径修改就好;
2. 配置环境变量,使得运行时库可以被找到
这里假装回到刚刚执行完make install 命令,接下来就是配置环境变量,让opencv3.4可以被找到:
1. 编辑配置文件
sudo gedit /etc/ld.so.conf.d/opencv.conf
2. 执行此命令后,有可能打开的是一个空白文件,也有可能文件中已经有/usr/local/lib, 只需要接着写入lib路径即可; 如:
/usr/local/opencv3.4/lib
写完后的结果如下:
3. 生效配置文件:
执行如下的命令才能让刚才的配置路径生效:
sudo ldconfig
其实执行完sudo ldconfig之后,就可以在对应的路径,也就是/usr/local/opencv3.4/lib 中找到一个对应的pkgconfig文件,如下:
进入到pkgconfig路径下后可以看到文件opencv.pc,具体内容如下:
# Package Information for pkg-config
prefix=/usr/local/opencv3.4
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/includeName: OpenCV
Description: Open Source Computer Vision Library
Version: 3.4.0Libs: -L${exec_prefix}/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_viz -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}
从上面的文件也可以看出 .pc 文件其实就是包含了当前opencv版本的信息以及文件信息,其实与opencvconfig.cmake文件属性类似;
4. 接下来就需要设置电脑上的环境变量, 添加这个.pc文件的路径,使其可以让pkgconfig可以找到;
配置 bash
sudo gedit /etc/bash.bashrc
在末尾追加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv3.4/lib/pkgconfig#也就是包含.pc文件的路径
保存, 执行如下命令使得配置生效:
source /etc/bahs.bashrc
更新:
sudo updatedb
3. 复杂的makefile的例子
这里举一个复杂的makefile的例子(对我比较复杂),部分makefile如下:
CC=g++ #设定编译器类型
CFLAGS = -I ../common/inc -std=c++1y -g0 -O3 -I/usr/local/opencv3.4/include #编译选项
$(shell mkdir -p $(OUT_DIR))
main: $(OUTPUT_SOC) $(OUTPUT_C) $(OUTPUT_MAP) $(OUTPUT_PACKET) $(OUTPUT_RX_DATA_PARSER) $(OUTPUT_DEBUG) $(OUTPUT_PROTOCOL) $(OUTPUT_DETECTIONDATA) $(OUTPUT_DOORFRAME) $(OUTPUT_LINESEGMENT)@$(CC) -pthread -o $@ $(CFLAGS) $(OUTPUT_SOC) $(OUTPUT_C) $(OUTPUT_MAP) $(OUTPUT_PACKET) $(OUTPUT_RX_DATA_PARSER) $(OUTPUT_DEBUG) $(OUTPUT_PROTOCOL) $(OUTPUT_DETECTIONDATA) $(OUTPUT_DOORFRAME) $(OUTPUT_LINESEGMENT) `pkg-config --libs --cflags opencv` #按照pkg的配置进行库的查找$(OUTPUT_SOC): src/socket.cpp #生成目标依赖库$(info Compiling $(<))@$(CC) $(CFLAGS) -c $< -o $@
其中,第6行的
`pkg-config --libs --cflags opencv`
这句话设定了利用pkg-config进行opencv的库的查找
为了确定opencv是否在config的路径中,可以用
export PKG_CONFIG_PATH 或者echo ${PKG_CONFIG_PATH}
进行检验;
.pc 文件参考:https://blog.csdn.net/absurd/article/details/599813
陈浩博士:https://blog.csdn.net/haoel/article/details/2887
环境配置参考:https://www.jianshu.com/p/f646448da265
在cmakelists和makefile中设置opencv相关推荐
- 利用C++中的opencv进行图像拼接
这篇文章依旧是记录采用C++复现图像拼接过程解决遇到的问题.因为自己没有学过C++,大学学的C考完试立马还给老师了,Python也是现学的,只会一点点MATLAB,所以遇到的问题和解决都很基础,目的是 ...
- Ubuntu 16.04中安装OpenCV 2.4.11
Original URL:http://www.linuxidc.com/Linux/2016-07/132882.htm Ubuntu 16.04中安装OpenCV 2.4.11参考网址如下: ht ...
- 如何在Android中使用OpenCV
看了网上的很多教程和官方http://opencv.willowgarage.com/wiki/Android提供的如何在Android上使用OpenCV的教程,照着一步一步的做最后总有些问题,不是A ...
- Rockchip rv1126平台在gstreamer1中添加OpenCv实现视频流负片的效果
研究了一天,发现最终代码只有几行,所以简单记录一下. 到写 这篇记录为止,我没有发现rv1126的gstreamer1补丁中,RK 没有为视频流提供负片效果的patch, 在RGA的API中, 确实有 ...
- Linux下Makefile中动态链接库和静态链接库的生成与调用
背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv库文件,自己写Makefile,通过arm-linux-g++编译.链接.生成可执行文件,从而实现了移植的过程.平台是Toradex的 ...
- 【从零学习OpenCV】4Ubuntu系统中安装OpenCV 4
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- makefile中变量有哪些?
make一些参数选项: -p 选项,可以打印出make过程中的数据库, 下面研究一下内置的变量和规则. -n 选项, 只运行,不执行, -d 选项,相当于–debug=a,b(basic),v(ver ...
- makefile中的零星知识点
文章目录 1 make命令的使用 2 变量的导出(export) 3 Makefile中可以使用shell命令 4 在Makefile中怎么放置第1个目标 5 假想目标 1 make命令的使用 执行m ...
- android安装python opencv_MacLinux环境在Android Studio中安装OpenCV
在Android Studio中安装OpenCV 对于女程序猿来说,每次安装个什么软件,或者是配置个什么环境啊,经常整得很崩溃.本程序猿阿姨也是如此~(啊,我说我是阿姨了吗?) 好了,言归正传~ 我们 ...
最新文章
- DB2数据库常用工具
- 常用字符与ASCII代码对照表
- bzoj3626:[LNOI2014]LCA
- 要是有力气的话可以做装卸工,月入过万不是梦
- Codeforces Round #131 (Div. 2) B. Hometask dp
- oracle怎么装系统,【Oracle安装与操作系统用户组】
- asp.net中获取远端WEB页内容
- Java速成系列-03-Java的下载
- CentOS(Linux)安装KETTLE教程 并配置执行定时任务
- canbus是什么意思_CANBUS是什么意思
- android 自由落体,Android动画之属性动画1 自由落体
- 用友财务系统对接第三方业务系统达到财务业务一体化管理
- python编程之条形码生成大全
- DNS服务器未响应惊叹号,怎么办呢电脑连接网络出现感叹号?
- Word格式处理控件Aspose.Words for .NET教程——设置字体格式并获取行距
- C#版 - Leetcode 306. 累加数 - 题解
- 计算机录音机应用程序在哪,win10电脑自带录音在哪里打开
- iOS 一个带动画的等待指示器
- 学习android开发的网站
- The 2020 ICPC Asia Shenyang Regional Programming Contest I题 Rise of Shadows(数论)
热门文章
- zeppelin k8s安装部署和基本使用教程(在线的分析工具)
- quartus调用D触发器DFF和JK触发器JKFF
- theadClasses设置Bootstrap Table表头样式
- 【旧文章搬运】360安全卫士HookPort.sys完美逆向
- Kibana6.x.x源码结构分析笔记
- Software--Architecture--SOA 面向服务体系结构
- c语言,指针与数组--指针与二维数组2
- 冲刺One之站立会议6 /2015-5-19
- [转载] python int类数据的内存大小
- [转载] real和imag在python_Python numpy.imag() 使用实例