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

一 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 not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值