这里写目录标题
- 一 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