当前位置: 代码迷 >> 综合 >> ubuntu1804编译opencv4.4 +cuda(附 编译 opencv4 静态库踩坑 + 多版本opencv共存)
  详细解决方案

ubuntu1804编译opencv4.4 +cuda(附 编译 opencv4 静态库踩坑 + 多版本opencv共存)

热度:94   发布时间:2023-12-04 11:53:57.0

这里写目录标题

  • 一 OpenCV源码编译
    • 1预备工作
    • 2一个典型的CMakeLists.txt
  • 二 一些可能的错误
    • 2.1 错误1
    • 2.2错误2
    • 2.3 和本机anaconda库冲突
  • 三 静态库编译踩坑
    • 3.1 编译
    • 3.2 Eigen3报错
    • 3.3 make时候,链接过程中报错 gflags
  • 四 多版本共存
    • 4.1 如何正确卸载opencv(如果不想删就可以直接多版本)
    • 4.2 安装多版本
  • 五 一些其他说明
    • 5.1 为什么CMakeList中要设置 set(OpenCV_DIR ~/your opencv source/build)?
  • 其他重要参考

一 OpenCV源码编译

1预备工作

1.1 最新版本opencv 需要libcurl4. ubuntu默认是libcurl3。解决办法看这里
1.2 opencv-contrib下载地址
1.3 把下列压缩包解压到目录opencv_contrib/modules/xfeatures2d/src/下。
压缩包地址:

链接:https://pan.baidu.com/s/17XhXX_cLz46bsj9ZWRkNIg
提取码:p50x

opencv源码文件夹与opencv_contrib源码文件夹在同一级目录,新建build文件夹,进入之后
1.4
接下来打开终端。进入build文件夹,然后安装环境依赖:

4.5的库

sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev

这里可能遇到一个问题

libjasper-dev找不到,修改源

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"
sudo apt update
sudo apt install libjasper1 libjasper-dev
cmake -D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=/usr/local \-D CUDA_ARCH_BIN='6.1' \-D WITH_CUDA=ON \-D WITH_CUBLAS=ON \-D WITH_TBB=ON \-D WITH_V4L=ON \-D WITH_OPENGL=ON \-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \-D WITH_QT=ON \ -D Qt5_DIR=~/Qt5.14.2/5.14.2/gcc_64/lib/cmake/Qt5 \-D OPENCV_GENERATE_PKGCONFIG=YES ..
#CMAKE_INSTALL_PREFIX=/usr/local/ #指定安装路径,我习惯在自己的home文件夹下面,放在/usr/local 下面删除很麻烦
#CUDA_ARCH_BIN='6.1' #指定GPU算力,在NVIDIA官网查询 https://developer.nvidia.com/cuda-gpus#compute
#OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ #opencv_contrib modules路径
#WITH_QT=ON #使用QT支持
#Qt5_DIR=~/Qt5.14.2/5.14.2/gcc_64/lib/cmake/Qt5 #使用qt再开启
#BUILD_SHARE_LIBS=OFF #编译静态链接库
```bash
make -j12
sudo make install
sudo ldconfig#动态库opencv验证方法
#找到你build文件夹所在的opencv源码包
#如果出错也有可能是ld、pkg等问题,也有可能是多版本冲突,文章后面会对可能出现的错误尽量进行说明
cd opencv/samples/cpp/example_cmake
cmake .
make
./opencv_example

2一个典型的CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
SET(PROJECT_NAME opencv_test) #opencv_test 是你项目名字,可以自己修改PROJECT(${PROJECT_NAME})
set(OpenCV_DIR ~/work/opencv-4.5.0_build_static/build) #你之前源码包里的build文件夹,防止版本冲突
find_package(OpenCV 4 REQUIRED) #寻找这个包 opencv 包名 4 最低版本号 REQUIRED 如果没找到就报错aux_source_directory(src DIR_SRCS) # src 是你存放源码的文件夹,如果在本目录aux_source_directory(. DIR_SRCS)
add_executable(${PROJECT_NAME} ${DIR_SRCS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

二 一些可能的错误

2.1 错误1

#include "boostdesc_bgm.i"
^~~~~~~~~~~~~~~~~
compilation terminated.

把下列压缩包解压到目录opencv_contrib/modules/xfeatures2d/src/下即可。

压缩包地址:

链接:https://pan.baidu.com/s/17XhXX_cLz46bsj9ZWRkNIg
提取码:p50x

2.2错误2

fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录

头文件include地址不对,解决方法如下:

将opencv-4.1.0/modules/features2d/test/文件下的

test_descriptors_invariance.impl.hpp
test_descriptors_regression.impl.hpp
test_detectors_invariance.impl.hpp
test_detectors_regression.impl.hpp
test_invariance_utils.hpp

拷贝到opencv_contrib-4.1.0/modules/xfeatures2d/test/文件下。

同时,将opencv_contrib-4.1.0/modules/xfeatures2d/test/test_features2d.cpp文件下的

#include "features2d/test/test_detectors_regression.impl.hpp"
#include "features2d/test/test_descriptors_regression.impl.hpp"

改成:

#include "test_detectors_regression.impl.hpp"
#include "test_descriptors_regression.impl.hpp"

将opencv_contrib-4.1.0/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp文件下的

#include "features2d/test/test_detectors_invariance.impl.hpp" 
#include "features2d/test/test_descriptors_invariance.impl.hpp"

改成:

#include "test_detectors_invariance.impl.hpp"
#include "test_descriptors_invariance.impl.hpp"

2.3 和本机anaconda库冲突

echo $PATH   #打印出当前PATH环境变量,发现有conda环境
/home/bcw/.local/bin:/home/bcw/.conda/envs/cv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
#修改当前终端PATH变量 不推荐在.bashrc中修改
#修改方式为把上面涉及到conda的去掉就好了,‘:’相当于分号,echo显示的数据每个人电脑不同,根据自己本机电脑环境进行调整,我只留了/usr 开头的项目。
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

三 静态库编译踩坑

3.1 编译

-D BUILD_SHARE_LIBS=OFF 选项可以在cmake的时候生成静态链接库版本的opencv,剩下步骤和动态连接库版本的相同

3.2 Eigen3报错

cmake时候出现大量此错误

CMake Error at CMakeLists.txt:10 (add_executable):Target "opencv_test" links to target "Eigen3::Eigen" but the target was notfound.  Perhaps a find_package() call is missing for an IMPORTED target, oran ALIAS target is missing?

解决方法:
修改之前的CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
SET(PROJECT_NAME opencv_test)PROJECT(${PROJECT_NAME})
set(OpenCV_DIR ~/work/opencv-4.5.0_build_static/build)
find_package(OpenCV 4 REQUIRED)
find_package(Eigen3) #指示cmake去找这个库aux_source_directory(src DIR_SRCS)
add_executable(${PROJECT_NAME} ${DIR_SRCS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${Eigen3_LIBS} )# 这里对应修改

3.3 make时候,链接过程中报错 gflags

链接不到gflags_shared,  去google搜索,好像是libgflags_shared.so改名了,尝试一下操作正常编译
先确保你的gflags正常安装,可以 locate libgflags.so 看一下安装位置,一般为 /usr 开头的文件夹。
通过添加软连接的方式,让 ld 成功找到 libgflags_shared
sudo ln -s 	/usr/lib/x86_64-linux-gnu/libgflags.so  /usr/lib/x86_64-linux-gnu/libgflags_shared.so

四 多版本共存

4.1 如何正确卸载opencv(如果不想删就可以直接多版本)

如果你不想一个电脑里面安装多个版本的opencv,可以使用这个方法卸载已经安装的opencv。这个方法比较安全,一些博客中写到 找到所有 *opencv* 并删除其实是很危险的,可能会把anaconda python环境搞坏。

cd /your opencv source/build/  #进入你源码包里的build文件夹
make uninstall
cd /CMAKE_INSTALL_PREFIX/ #进入你之前cmake时候设置的CMAKE_INSTALL_PREFIX 文件夹,
###############!!!!!!!!!!! 以下这几步需要注意,因为我的CMAKE_INSTALL_PREFIX 是单独设置的,放在自己的工作文件夹下面,所以里面只有这几个文件
#########!!!!!!如果你之前安装在比如 /usr/local 下面,要按照下面文件树删,很麻烦,多用find指令。也可以直接多版本,我就是因为嫌删除麻烦才直接多版本的
rm -rf ./bin
rm -rf ./include
rm -rf ./lib
rm -rf ./share

如果要是真想删的话,参考以下文件树
进行删除,有opencv4开头的可以直接删

4.2 安装多版本

举例说明
1.下载opencv4.4 opencv4.5源码包
2.分别在源码包里面build,注意 要指定不同的 CMAKE_INSTALL_PREFIX,剩下的步骤就是正常编译
3.如果想使用不同版本的opencv,需要修改CMakeLists中的 set(OpenCV_DIR ~/your opencv source/build) 将其设置为不同版本源码包中的build文件夹

五 一些其他说明

5.1 为什么CMakeList中要设置 set(OpenCV_DIR ~/your opencv source/build)?

主要是为了方便 find_package,使用这个功能就不需要自己设置 include path libraries path等乱七八糟的东西,但是使用这个功能需要一个×××.cmake文件告诉cmake你的opencv的lib还有include等信息,而这个东西就在 your opencv source/build 文件夹里面,这样cmake就能读取到你自己编译的opencv中的各种安装信息。通过设置不同的路径可以让cmake找到不同版本的opencv,非常灵活。

其他重要参考

Ubuntu18.04+CUDA8.0+cuDNN11.0环境下,编译安装opencv4.4.0和darknet、测试yolov4踩坑集锦
https://blog.csdn.net/mbytes/article/details/108282329