看了很多篇博客都不管用,三天解决了。按这个来就没问题。
本篇文章解决了SURF,SIRF算法使用xfeatures2d这个的权限问题。
不管你是ubuntu18.04还是ubuntu20.04还是其他版本,要安装的版本不是opencv4.2.0也没事,你要安装什么版本就下载什么版本的opencv和opencv_contrib。(opencv_contrib是扩展功能,就按我的步骤一步步安装操作就行)
问题描述:
问题是在使用sift/surf等算法时报错:
terminate called after throwing an instance of 'cv::Exception'
what(): OpenCV(4.2.0) /home/cgm/opencv-4.2.0/opencv_contrib-4.2.0/modules/xfeatures2d/src/surf.cpp:1027: error: (-213:The function/feature is not implemented) This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'create'
已放弃 (核心已转储)
OpenCV xfeatures2d_SURF -213:未实现功能/功能
错误:(-213:未实现功能/功能)此算法已申请专利,并且在此配置中不包括在内;设置OPENCV_ENABLE_NONFREE CMake选项并在函数’cv :: xfeatures2d :: SURF :: create’中重建库
问题原因:
xfeature2d此算法申请了专利。然而我们安装opencv时没有增加 这个命令 -DOPENCV_ENABLE_NONFREE=ON \ 导致的
解决办法
看了很多篇博客,最终解决了这个问题。有的说降低版本啥的,试了不管用。简单粗暴又快的方法-那就是重装opencv,不要怕不会卸载重装。这篇很详细。按步骤一步一步往下走。
1.卸载
找到当初安装 opencv4.2.0的 build 目录,进入 build 目录
cd ~/opencv-4.1.2/build
sudo make uninstall
cd ..
sudo rm -rf build
清理 /usr 中所有 opencv 相关项,直接复制粘贴到终端运行。这一步删不干净不影响,接着往下
//注意这里为了确保删干净重复写了一些路径,建议大家打开文件夹对照代码所示路径一个个删除
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*
cd /usr
//发现搜不到有关opencv的任何文件,说明删干净了
find . -name "*opencv*" | xargs sudo rm -rf
cd ~
sudo rm -rf opencv-4.2.0
2.下载安装
下载opencv4.2.0和opencv_contrib-4.2.0源码压缩包
opencv4.2.0 地址https://github.com/opencv/opencv/tree/4.2.0
opencv_contrib-4.2.0地址https://github.com/opencv/opencv_contrib
首先在终端中输入如下命令来安装依赖包:
sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
sudo apt install build-essential qt5-default ccache libv4l-dev libavresample-dev libgphoto2-dev libopenblas-base libopenblas-dev doxygen openjdk-8-jdk pylint libvtk6-dev
3、配置opencv
1、将opencv4.2.0和opencv_contrib-4.2.0解压(提取),放在一个文件夹opencv-4.2.0下,如下图所示:
再将boostdesc.i等.zip里的文件全部复制到~/opencv-4.2.0/opencv_contrib-4.2.0/modules/xfeatures2d/src下(因为这些文件很难载下来,缺少这一步的话,后续编译就会报错)
在这里下载boostdesc.i等.zip里的文件
百度云链接:https://pan.baidu.com/s/14Q7N1p-7QrUBQzGIAPCWBw 密码: spgp
2、双击进入解压出来的opencv-4.2.0文件夹,右键打开终端,然后依次输入
mkdir build
cd build
3.然后进行cmake编译,参数可自行调整:(这一步是重点)
//前三行别的设不设置都无所谓,OPENCV_GENERATE_PKGCONFIG如果不设置在opencv4中就不会
//自动生成opencv.pc文件导致查询不到opencv版本号,后续要解决只能自己手写文件(但是容易错)
//或者卸载opencv重装,所以这里直接开启就一劳永逸了
cmake -D WITH_TBB=ON -D WITH_EIGEN=ON -D OPENCV_GENERATE_PKGCONFIG=ON ..
cmake -D BUILD_DOCS=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=ON ..
cmake -D WITH_OPENCL=OFF -D WITH_CUDA=OFF -D BUILD_opencv_gpu=OFF -D BUILD_opencv_gpuarithm=OFF -D BUILD_opencv_gpubgsegm=OFF ..
//OPENCV_ENABLE_NONFREE:BOOL如果不开启在使用sift/surf等算法时会报错
//因为我是用c++进行编程 所以用INSTALL_C_EXAMPLES=ON,如果想用python则替换为INSTALL_PYTHON_EXAMPLES=ON
//OPENCV_EXTRA_MODULES_PATH后面跟的是opencv_contrib-4.1.2的路径,记得照着自己的电脑路径改一下
//如果不需要装opencv_contrib-4.1.2 那就删掉OPENCV_EXTRA_MODULES_PATH
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_ENABLE_NONFREE:BOOL=ON -D INSTALL_C_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv-4.1.2/opencv_contrib-4.1.2/modules ..
接下来开始编译
//有单线程和多线程两种编译方法 单线程编译比较慢,建议采用多线程
//j后面表示的数字是想要用几线程进行编译,这里我选择了8线程,直接复制不用管
sudo make -j8
编译结束后
sudo make install
4.配置opencv环境
//打开opencv.conf
sudo gedit /etc/ld.so.conf.d/opencv.conf
//在末尾添加
/usr/local/lib
//保存后执行以下命令,确保配置生效
sudo ldconfig
//打开bash.bashrc
sudo gedit /etc/bash.bashrc
//在文末添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
5.测试
cd ~/opencv-4.1.2/samples/cpp/example_cmake
cmake .
make
./opencv_example
如果摄像头打开,左上角出现 Hello OpenCV 则证明安装成功
安装参考链接:地址
参考链接2:地址