当前位置: 代码迷 >> 综合 >> Ubuntu下多个版本OpenCV管理(cmake makefile设置方法)
  详细解决方案

Ubuntu下多个版本OpenCV管理(cmake makefile设置方法)

热度:74   发布时间:2023-10-01 03:21:51.0

https://www.cnblogs.com/xzd1575/p/5555523.html:

 

Ubuntu下多个版本OpenCV管理(多Opencv版本)以及:libopencv_highgui.so.3.4: cannot open shared object file: No such file or directory 报错的解决方法。

背景:

最近,在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,内容如下:

Ubuntu下多个版本OpenCV管理(cmake makefile设置方法)

#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}

Ubuntu下多个版本OpenCV管理(cmake makefile设置方法)

当然,我们也可以使用

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文件,其内容如下:

Ubuntu下多个版本OpenCV管理(cmake makefile设置方法)

#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

Ubuntu下多个版本OpenCV管理(cmake makefile设置方法)

我发现其中的路径是不太准确的,更正为:

Ubuntu下多个版本OpenCV管理(cmake makefile设置方法)

#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

Ubuntu下多个版本OpenCV管理(cmake makefile设置方法)

并将其拷贝到/ 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