欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ubuntu opencv2和opencv3共存问题

程序员文章站 2024-03-26 09:36:23
...

ubuntu opencv2和opencv3共存问题

如题,对于这个问题,原来的老程序用的是opencv2,而新的是opencv3 ,那么这个共存问题,其实也不是很麻烦,就是编译的时候Cmake 需要稍微设置一下参数

也就是说,以前,我们配置opencv的时候,都是对其编译,配置,然后make install 到系统,其实make install 也就是把编译好的静态库和动态库放在/usr/local 而已,然后每次编译的时候Cmake 仅仅是按照优先级顺序在指定的搜索路径进行查找Findxxx.cmake文件和xxxConfig.cmake文件,然后再找到对应的/usr/local/include/opencv;/usr/local/include 等一些列对应的include 和 lib的存放位置。

本文再书写的时候,已经把opencv2给装好了,然后想运行opencv3 的东西,发现无法通过编译。

然后我就下载了opencv3.1.0 当然这个版本不用在意。把对应的他需要调的一些库都给下好了,

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential cmake pkg-config
$ sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
$ sudo apt-get install libgtk-3-dev
$ sudo apt-get install libatlas-base-dev gfortran

$ cd ~
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
$ unzip opencv.zip

$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
$ unzip opencv_contrib.zip

也就是正常的安装及其对应的库,然后我们不是要编译嘛,原来安装再系统里是要这样操作:

$ cd ~/opencv-3.1.0/
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
    -D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
    -D BUILD_EXAMPLES=ON ..

这里是从别人哪里摘录的,要注意如果你想装在系统里,俺么对应的路径要搞清楚,不然很麻烦,但这个不是重点。之前讲了因为已经装了opencv2 了,对于共存问题,我仅仅只是想在写代码的时候能调库而已。所以我直接在下载好的文件夹里opencv-3.1.0 直接编译了。

$ cd ~/opencv-3.1.0/
$ mkdir build
$ cd build
$ cmake ..

然后就会有一系列的文件夹生成

接着我们开始编译opencv文件

$make -j4

这里的 j表示编译的线程核数量,当然越多越好,不过如果你机子没有这么多,就会报错,所以数量这是机子的最大就行,报错了就调小一点。

那么编译好了,我们实际上这个库已经能用了,那么我们怎么写CMakeLists.txt 才能让他看见opencv3 的地方呢?

# CMakeLists.txt to build 
cmake_minimum_required(VERSION 2.8) 

#项目名字
project(HelloWorld)

# aux_source_directory(DIR_SRC ./enum_gpu.cu)


set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "/home/k/SoftWare/opencv-3.1.0/build")
message("cmake_module_path: ${CMAKE_MODULE_PATH}") 
set(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
find_package(Opencv REQUIRED)

cuda_add_executable(canny 5-10-13.cpp)

include_directories(${OpenCV_INCLUDE_DIRS}) # Not needed for CMake >= 2.8.11

# target_sources(HelloWorld PRIVATE sumArrOnGPU.cu)
target_link_libraries(canny ${OpenCV_LIBS})

# link_directories(${OpenCV_LIBS})

message("OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}") 
message("OpenCV_LIBS: ${OpenCV_LIBS}")

先贴一下成功的cmakelist

可以看到首先,对应 CMAKE_MODULE_PATH   进行了设置,表示要搜索的文件夹进行设置。然后这样还不行。因为你会发现

这个find_package(Opencv REQUIRED) 的Opencv 是小写的,而不是大写的,这是因为我们调用系统的 是find_package(OpenCV REQUIRED) 

这里是让系统按照Module模式进行查找,也就是想办法弄出一个FindOpencv.cmake文件,之后设置一下CMAKE_MODULE_PATH变量。下面是具体操作:因为我们在所有目录中没有找到FindOpencv.cmake文件。只能找到OpenCVConfig.cmake文件。我们可以将这个文件名字更改为FindOpencv.cmake 

总结来说就是:

1. 把 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "/home/k/SoftWare/opencv-3.1.0/build") 中的路径换成opencv3的 没有装在系统中的build路径(里面包含了 Findxxx.cmake文件和xxxConfig.cmake)

2.将 OpenCVConfig.cmake 更换成 Findxxxx.cmake 注意这里的xxx名字,你将会你在CMakeLists 中用到,我这里用了Opencv

3.find_package(xxxx REQUIRED)  我这里是 find_package(Opencv REQUIRED)

这样你就能完美调用了!

这里做一下补充

find_package使用简介:
  首先明确一点,cmake本身不提供任何关于搜索库的便捷方法,也不会对库本身的环境变量进行设置。它仅仅是按照优先级顺序在指定的搜索路径进行查找Findxxx.cmake文件和xxxConfig.cmake文件(其中xxx代表库的名字,特别注意的是有大小写之分),这两个文件大体上是没有区别的,cmake能够找到这两个文件中的任何一个,我们都能成功使用该库,也就是我们可以用库的内置好了Cmake变量。包含了库的头文件和库文件的路径信息,虽然库的作者一般会提供这两个文件,但是也会遇到安装完毕后找不到的情况。当我们在cmake..命令之后,Cmake 会读取执行CMakeLists.txt中的代码,当执行find_package()这条命令后,Cmake 就会从某些路径中找这Findxxx.cmake文件或者xxxConfig.cmake文件,Cmake找到任意一个之后就会执行这个文件,然后这个文件执行后就会设置好一些Cmake变量。

比如下面的变量(NAME表示库的名字 比如可以用Opencv 代表Opencv库):

<NAME>_FOUND
<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES
<NAME>_LIBRARIES or <NAME>_LIBRARIES or <NAME>_LIBS
<NAME>_DEFINITIONS

一般常用的就是xxx_FOUND 、xxx_INCLUDE_DIRS、xxx_LIBS,分别代表是否找到库的标志、库的头文件路径、库文件路径。find_package()有两种模式:Module模式和Config模式,分别对应上面的Findxxx.cmake 和xxxConfig.cmake两个文件。cmake默认优先Module模式,而Config模式是备选项。

Module模式(仅仅查找Findxxx.cmake文件):
Cmake会优先搜索CMAKE_MODULE_PATH指定的路径,如果在CMakeLists.txt中没有设置CMAKE_MODULE_PATH为存储Findxxx.cmake的路径,也就是说没有下面的指令:
set(CMAKE_MODULE_PATH "Findxxx.cmake文件所在的路径")
那么Cmake不会搜索CMAKE_MODULE_PATH指定的路径,此时Cmake会搜索第二优先级的路径,也就是<CMAKE_ROOT>/share/cmake-x.y/Mdodules (注意:x.y表示版本号。我的是3.10)。其中CMAKE_ROOT是你在安装Cmake的时候的系统路径,因为我并没有指定安装路径,所以是系统默认的路径,在我的系统中(ubuntu16.04)系统的默认路径是/usr/loacl,如果你在安装的过程中使用了
cmake -DCMAKE_INSTALL_PREFIX=自己dir路径 ,那么此时CMAKE_ROOT就代表那个你写入的路径 。刚刚说道第一优先级的路径搜索没有找到Findxxx.cmake文件,就会到第二优先级的路径下搜索。如果Cmake在两个路径下都没有找到Findxxx.cmake文件。那么Cmake就会进入Config模式。

Config模式(仅仅查找xxxConfig.cmake文件):
Cmake会优先搜索xxx_DIR 指定的路径。如果在CMakeLists.txt中没有设置这个cmake变量。也就是说没有下面的指令:
set(xxx_DIR "xxxConfig.cmkae文件所在的路径")
那么Cmake就不会搜索xxx_DIR指定的路径,此时Cmake 就会自动到第二优先级的路径下搜索,也就是/usr/local/lib/cmake/xxx/中的xxxConfig.cmake文件。
上面主要讲了Cmake的搜索模式。如果Cmake在两种模式提供的路径中没有找到对应的Findxxx.cmake和xxxConfig.cmake文件,此时系统就会提示最上面的那些错误信息。

参考资料:

1.https://www.pyimagesearch.com/2016/10/24/ubuntu-16-04-how-to-install-opencv/

2.https://www.cnblogs.com/newneul/p/8364924.html

3.https://blog.csdn.net/haluoluo211/article/details/80559341