https://www.cnblogs.com/xzd1575/p/5555523.html:
背景:
最近,在Nvidia的GPU中嵌入式开发板Jetson TX1(简称TX1)上移植深度学习目标检测算法YOLO。在TX1上安装了官方提供的opencv版本--OpenCV4Tegra(OpenCV-2.4.12),但是使用该版本opencv VideoCapture在读取摄像头数据时出错,显示错误:
无法停止流:设备或资源忙
无法停止流:错误的文件描述符
使用Google试图找到解决方法,最后发现官方给出答案,只能重新安装Opencv3.0以上的版本。我使用Nvidia论坛jkjung提供的方法安装OpenCV3.1.0。安装完成后,我使用的TX1 Ubuntu14.04上安装了两个版本的OpenCV,Opencv-2.4.12和Opencv-3.1.0。因此,我在面向程序中指定使用期望版本的OpenCV,即Ubuntu下多个版本Opencv管理的问题。
解决方案:
现在讨论Ubuntu14.04下分别使用的CMake和Makefile文件编译运行带opencv的程序的两种解决方案。
1. CMake下指定Opencv版本
关键文件:OpenCVConfig.cmake在OpenCV的编译好后,所在目录中一般会有一个叫OpenCVConfig.cmake的文件,这个文件中指定了的CMake要去哪里找OpenCV的,其的.h文件在哪里等,比如其中一行:
#提供了包括目录给调用者
集(OpenCV_INCLUDE_DIRS “ /home/ubuntu/src/opencv-3.1.0/build ” “ /home/ubuntu/src/opencv-3.1.0/include ” “ /家/ Ubuntu的/ src目录/opencv-3.1.0/include/opencv “)
只要让CMake的找到这个文件,这个文件就指定了opencv的的所有路径,因此设置OpenCV_DIR为包含OpenCVConfig.cmake的目录,如在我的C ++工程的CMakeLists.txt中添加
设置(OpenCV_DIR “ /home/ubuntu/src/opencv-3.1.0/build ”)
我的OpenCVConfig.cmake在
/home/ubuntu/src/opencv-3.1.0/build
注意,将其添加在项目(MyProjectName)之前。
如的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 2.8 )
set(OpenCV_DIR“/home/ubuntu/src/opencv-3.1.0/build”)
项目(摄像头)
find_package(OpenCV REQUIRED)
add_executable(camera camera.cpp)
target_link_libraries(相机$ {OpenCV_LIBS})
因此,我们期望使用哪个版本的opencv的,只要找到对应的OpenCVConfig.cmake文件,并且将其路径添加到工程的的CMakeLists.txt中即可了。
2. Makefile下指定Opencv版本
关键文件:opencv.pc。在Makefile下,应该是可以在其中详细设置Opencv路径,要使用到哪些库等等(我没有仔细学习过Makefile的使用)。在此,我想介绍一种简单的在生成文件下指定期望使用的opencv的版本的方法,该方法借助linux的下pkg配置命令。
我们常常使用pkg-config --modversion来查看指定库的版本,比如查看opencv版本pkg-config --modversion opencv。其实pkg-config显示的信息来自于这些库对应的.pc文件,比如安装了opencv后,我们可以在/ usr / lib / pkg-config /文件夹下找到opencv.pc,内容如下:
#pkg-config
prefix =的软件包信息 / usr
exec_prefix = $ {前缀}
libdir = $ {exec_prefix} / lib
includedir_old = $ {prefix} / include / opencv
includedir_new = $ {prefix} / include
名称:OpenCV
描述:开源计算机视觉库
版本: 2.4.12.2
利布斯: -L $ {exec_prefix} / lib目录-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab - lopencv_detection_based_tracker -lopencv_esm_panorama -lopencv_facedetect -lopencv_imuvstab -lopencv_tegra -lopencv_vstab -L / usr / local / cuda-7.0 / targets / armv7-linux-gnueabihf / lib -lcufft -lnpps -lnppi -lnppc -lcudart -ltbb -lrt -lpthread -lm - LDL
Cflags: -I $ {includedir_old} -I $ {includedir_new}
当然,我们也可以使用
pkg-config - cflags opencv
pkg -config --libs opencv
分别查看opencv库的包含目录(include /,.h)和库名称(.so)。在Makefile中,可以通过以上命令设置opencv库相关目录。如下:
COMMON + = - DOPENCV
CFLAGS + = - DOPENCV
LDFLAGS + =`pkg配置--libs的OpenCV `
COMMON + =`pkg-config --cflags opencv`
此时Makefile文件对应的工程使用的OpenCV的库即为opencv.pc文件中所指的版本。本例中为2.4.12.2。
那么可以容易想到,如果我在/ usr / lib目录/ pkgconfig文件夹目录下添加OpenCV的-3.1.0.pc文件,是否就可以将版本指向的OpenCV-3.1.0l了呢?答案是肯定的。
我在编译的OpenCV-3.1.0的编译目录下/home/ubuntu/src/opencv-3.1.0/build/目录下找到了UNIX的安装/ opencv.pc文件,其内容如下:
#pkg-config
prefix的包信息 = / home / ubuntu / opencv-3.1 .0
exec_prefix = $ {前缀}
libdir = $ {exec_prefix} / lib
includedir_old = $ {prefix} / include / opencv
includedir_new = $ {prefix} / include
名称:OpenCV
描述:开源计算机视觉库
版本: 3.1 .0
库: -L $ {exec_prefix} / lib目录-lopencv_cudabgsegm -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_shape -lopencv_stitching -lopencv_cudafeatures2d -lopencv_superres -lopencv_cudacodec -lopencv_videostab -lopencv_cudaoptflow -lopencv_cudalegacy -lopencv_calib3d -lopencv_features2d -lopencv_objdetect -lopencv_highgui -lopencv_videoio -lopencv_photo -lopencv_imgcodecs -lopencv_cudawarping -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_video -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_cudaarithm -lopencv_core -lopencv_cudev
我发现其中的路径是不太准确的,更正为:
#pkg-config的包信息
prefix = / home / ubuntu / src / opencv-3.1 .0
exec_prefix = $ {prefix} / build
libdir = $ {exec_prefix} / lib
includedir_old = $ {prefix} / include / opencv
includedir_new = $ {prefix} / include
名称:OpenCV
描述:开源计算机视觉库
版本: 3.1 .0
库: -L $ {exec_prefix} / lib目录-lopencv_cudabgsegm -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_shape -lopencv_stitching -lopencv_cudafeatures2d -lopencv_superres -lopencv_cudacodec -lopencv_videostab -lopencv_cudaoptflow -lopencv_cudalegacy -lopencv_calib3d -lopencv_features2d -lopencv_objdetect -lopencv_highgui -lopencv_videoio -lopencv_photo -lopencv_imgcodecs -lopencv_cudawarping -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_video -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_cudaarithm -lopencv_core -lopencv_cudev
并将其拷贝到/ usr / lib中/ pkgconfig目录下,并重命名为的OpenCV-3.1.0.pc,将原来的opencv.pc重命名为的OpenCV-2.4.12.pc。
那么当我期望使用的OpenCV-3.1.0时,生成文件中为:
COMMON + = - DOPENCV
CFLAGS + = - DOPENCV
LDFLAGS + =`pkg-config - libs opencv-3.1.0`
COMMON + =`pkg-config --cflags opencv-3.1.0`
当我期望使用的OpenCV-2.4.12时,生成文件中为:
COMMON + = - DOPENCV
CFLAGS + = - DOPENCV
LDFLAGS + =`pkg-config - libs opencv-2.4.12`
COMMON + =`pkg-config --cflags opencv-2.4.12`
从而实现了多个版本的OpenCV的使用。
备注:
运行make之后,运行可执行程序时,可能会提示找不到库的错误(not find libopencv-core.so.3.1之类),那时因为动态库目录不在程序搜索库目录的路径下,系统默认的动态库搜索路径有在/ usr / local / lib目录等,OpenCV4Tegra(OpenCV的-2.4.12)生成的库都在在/ usr / local / lib目录目录,但OpenCV的-3.1.0的库在/家庭/ Ubuntu的/ src目录/opencv-3.1.0/build/lib中,不在搜索路径中,因此,只需要添加其为搜索路径即可。添加方法为/etc/ld.so.conf.d/libc.conf中添加/家/ubuntu/src/opencv-3.1.0/build/lib.libc.conf文件内容如下:
#libc中默认的配置
在/ usr /本地/ lib中
/home/ubuntu/src/opencv-3.1.0/build/lib
最后:
sudo ldconfig 使libc文件立即生效
https://www.cnblogs.com/dengwenwu/p/7808989.html