Ubuntu20.04编译安装opencv3.2和opencv_contrib-3.2

2023-11-06

图像特征提取中需要用到SIFT等算法,因此不得不安装从源码编译安装opencv_contrib,网上有很多教程,但是在不同的环境下多少会出现一些错误,针对Ubuntu20.04、gcc-7环境下对opencv+opencv_contrib编译、安装、测试总结如下:

一、依赖环境安装

sudo apt-get installbuild-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 libjasper-dev libdc1394-22-dev

二、opencv3.2和opencv_contrib-3.2下载

网上有很多的版本,我下载编译的原始版本为
https://github.com/hanxuan123/opencv3.2/tree/master/all
我修改及编译好的文件下载地址:https://download.csdn.net/download/qq_41721951/85095064

三、cmake

cmake -D CMAKE_EXE_LINKER_FLAGS=-lcblas -D WITH_TBB=ON -D WITH_OPENMP=ON 
-D WITH_IPP=ON -D WITH_CUDA=OFF -D ENABLE_CXX11=1 -D BUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DOPENCV_GENERATE_PKGCONFIG=ON -DCMAKE_INSTALL_PREFIX=/usr/local/opencv32 
-DOPENCV_EXTRA_MODULES_PATH=/home/zhoudk/rgbdslam_catkin_ws/opencv3.2/opencv-3.2.0/opencv_contrib-3.2.0/modules 
-D ENABLE_PRECOMPILED_HEADERS=OFF ..

注意:
-DCMAKE_INSTALL_PREFIX为opencv最后的安装路径
-DOPENCV_EXTRA_MODULES_PATH为opencv_contrib-3.2中的modules文件路径

cmake中可能会出现如下错误,错误及解决办法总结如下

1、cmake时可能因为网络原因出现ippicv_linux_20151201.tgz、protobuf-cpp-3.1.0.tar.gz、boostdesc_lbgm.i、vgg_generated_80.i等文件下载失败,在搜索相关文件下载即可,下载后放到相应文件夹即可。

2、opencv cmake编译中出现fatal error:stdlib.h:没有那个文件或目录,如下
在这里插入图片描述
解决方案:cmake命令中添加-DENABLE_PRECOMPILED_HEADERS = OFF

3、CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_nppi_LIBRARY (ADVANCED)
如下所示:
在这里插入图片描述
在这里插入图片描述
解决方案参考:
https://blog.csdn.net/zqjackking/article/details/80546197
https://blog.csdn.net/u014613745/article/details/78310916
原因解析:
cuda9不再支持2.0架构
解决方案如下:

(1)opencv3.2文件夹下找到FindCUDA.cmake文件

1)找到行

find_cuda_helper_libs(nppi)

改为

find_cuda_helper_libs(nppial)
find_cuda_helper_libs(nppicc)
find_cuda_helper_libs(nppicom)
find_cuda_helper_libs(nppidei)
find_cuda_helper_libs(nppif)
find_cuda_helper_libs(nppig)
find_cuda_helper_libs(nppim)
find_cuda_helper_libs(nppist)
find_cuda_helper_libs(nppisu)
find_cuda_helper_libs(nppitc)

2)找到行

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")

改为

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")

3)找到行

    unset(CUDA_nppi_LIBRARY CACHE)

改为

    unset(CUDA_nppial_LIBRARY CACHE)
    unset(CUDA_nppicc_LIBRARY CACHE)
    unset(CUDA_nppicom_LIBRARY CACHE)
    unset(CUDA_nppidei_LIBRARY CACHE)
    unset(CUDA_nppif_LIBRARY CACHE)
    unset(CUDA_nppig_LIBRARY CACHE)
    unset(CUDA_nppim_LIBRARY CACHE)
    unset(CUDA_nppist_LIBRARY CACHE)
    unset(CUDA_nppisu_LIBRARY CACHE)
    unset(CUDA_nppitc_LIBRARY CACHE)
(2)找到文件 OpenCVDetectCUDA.cmake,修改以下几行
     ...
      set(__cuda_arch_ptx "")
      if(CUDA_GENERATION STREQUAL "Fermi")
        set(__cuda_arch_bin "2.0")
      elseif(CUDA_GENERATION STREQUAL "Kepler")
        set(__cuda_arch_bin "3.0 3.5 3.7")
      ...

改为

     ...
      set(__cuda_arch_ptx "")
      if(CUDA_GENERATION STREQUAL "Kepler")
        set(__cuda_arch_bin "3.0 3.5 3.7")
      elseif(CUDA_GENERATION STREQUAL "Maxwell")
        set(__cuda_arch_bin "5.0 5.2")
      ...

(3)cuda9中有一个单独的halffloat(cuda_fp16.h)头文件,也应该被包括在opencv的目录里,将头文件cuda_fp16.h添加至 opencv\modules\cudev\include\opencv2\cudev\common.hpp,即在common.hpp中添加#include <cuda_fp16.h>,重新生成即可 。

四、make

使用命令sudo make -j8
1、如果使用make -i8,可能会出现如下错误
Built target libprotobuf
make: *** [Makefile:163:all] 错误 2
在这里插入图片描述
解决方法:使用sudo make -j8
2、错误:make[2]: *** [modules/python3/CMakeFiles/opencv_python3.dir/build.make:56: modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:21149: modules/python3/CMakeFiles/opencv_python3.dir/all] Error 2
make: *** [Makefile:138: all] Error 2
解决方案参考:https://www.likecs.com/show-204892088.html

解决办法如下:在路径opencv3.2/modules/python/src2路径下找到cv2.cpp文件

在730修改为PyString_AsString(obj)前添加(char *)
修改为如下所示

bool pyopencv_to(PyObject* obj, String& value, const char* name)
{
    (void)name;
    if(!obj || obj == Py_None)
        return true;
    char* str = (char *)PyString_AsString(obj);    //char* str = (PyString_AsString(obj)
    if(!str)
        return false;
    value = String(str);
    return true;
}

3、出现AVFMT_RAWPICTURE, CODEC_FLAG_GLOBAL_HEADER报错
解决方法:根据报错文件,将相应位置

AVFMT_RAWPICTURE 修改为 AVFMT_NOFILE;
CODEC_FLAG_GLOBAL_HEADER 修改为 AV_CODEC_FLAG_GLOBAL_HEADER;

五、sudo make install

opencv最后安装在/usr/local/opencv32 路径下,如图
在这里插入图片描述

六、opencv及SIFT特征图像检测

#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
  
 using namespace std;
 using namespace cv;
  
 int main(int argc, char** argv) {
     
     cv::Mat img = cv::imread("rgb.png", CV_LOAD_IMAGE_GRAYSCALE);
 
     cv::Mat out_img,des;
     vector<cv::KeyPoint> pts;
     
     Ptr<xfeatures2d::SIFT> sift=cv::xfeatures2d::SIFT::create();
     sift->detectAndCompute(img,cv::noArray(),pts,des);
     //检测到的特征为pts,同时计算描述子为des
     // sift->detect(img,pts);//只进行检测特征
 /*
     Ptr<xfeatures2d::SURF> surf=cv::xfeatures2d::SURF::create();
     surf->detectAndCompute(img,cv::noArray(),pts,des);
     // surf->detect(img,pts);
 */
     cv::drawKeypoints(img,pts,out_img);
     
     cv::imshow("Image", out_img);
     //cv::imwrite("sift.png",out_img);
     cv::waitKey(0);
 
     return 0;
 }

CMakeLists.txt,当系统安装多个opencv时,通过find_package()指定需要的特定opencv版本,避免链接到其他版本。

cmake_minimum_required(VERSION 2.8)

set(CMAKE_BUILD_TYPE "Release")
# 添加c++ 11标准支持
set(CMAKE_CXX_FLAGS "-std=c++11 -O2")

# 寻找OpenCV库,指定路径
find_package(OpenCV REQUIRED 
			PATHS /usr/local/opencv32   #指定了PATHS查找路径
			NO_DEFAULT_PATH)            #NO_DEFAULT_PATH表示不启用默认路径,即剔除掉系统路径
# 添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(siftTest siftTest.cpp)
target_link_libraries(siftTest ${OpenCV_LIBS})

sift特征提取结果如下
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu20.04编译安装opencv3.2和opencv_contrib-3.2 的相关文章

随机推荐

  • 前端福利:使用Wallpaper Engine让自己的桌面炫酷起来

    Wallpaper Engine 是一款Steam上的特别特别炫酷的壁纸定制软件 它可以对你的桌面进行定制 可以使用视频 动画 网页等形式来替换壁纸 注意到没 关键是可以使用Html格式的文件作为桌面 前端福利啊有木有 首先 先先下载软件下
  • QT结合Mupdf实现预览pdf

    要在Qt中结合MuPDF库预览PDF文件 你可以按照以下步骤进行操作 1 下载并安装MuPDF库 首先 你需要从MuPDF的官方网站或代码托管网站上下载MuPDF库的源代码 并按照文档中的说明进行安装 确保你已经安装了所有必需的依赖项 2
  • 因果推断综述-A Survey on Causal Inference

    最近读到一篇讲述很全面的综述文献 A Survey on Causal Inference 对于接触因果推断不久的同学而言是特别详细的介绍和科普 文献很长 我会分成几部分介绍 目录 摘要 第一部分 简介 第二部分 因果推断基础知识 第三部分
  • java(有关类成员变量的访问权限)

    private public protected 默认不写 firendly 1 Class类的访问权限 public 可以供所有的类访问 默认 默认可以称为friendly但是 java语言中是没有friendly这个修饰符的 这样称呼应
  • Linux 编写定时任务

    1 先进入根目录 mkdir p home wangwenjun scripts cd home wangwenjun scripts 2 编写第一个shell文件 test sh vim test sh bin sh now date Y
  • Windows下Git-preview中文乱码的解决方法

    在Windows下安装Git preview 1 7 4后 使用中发现许多的乱码问题 感觉甚是不便 这是因为Git是在linux下开发的管理软件 而linux的编码方式是基于UTF 8的 所以移植到Windows之后难免会存在编码方式不同的
  • android wear 微信语音,moto 360手表语音回复微信教程

    moto360智能手表是一款搭载android系统的智能手表 目前微信已经添加了对智能手表的支持 不过很多玩家对于怎么使用moto 360语音回复微信还不是很清楚 下面小编就为大家分享一下moto 360语音回复微信教程 moto 360语
  • 最大权闭合子图(最小割)

    最大权闭合子图 最大流最小割 参考资料 1 最大权闭合子图 权闭合子图 存在一个图的子图 使得子图中的所有点出度指向的点依旧在这个子图内 则此子图是闭合子图 在这个图中有8个闭合子图 3 4 2 4 3 4 1 3 4 2 3 4 1 2
  • Qt绘图QGraphicsView、QGraphicsScene、QGraphicsItem简述

    Qt绘图中 QGraphicsView QGraphicsScene QGraphicsItem三者之间密不可分 以下简单介绍三者之间关系 三者之间关系 如同绘画的过程 Qt绘图中 QGraphicsView的作用相当于画板 QGraphi
  • linux 使用笔记

    1 查看使用的所有端口 netstat ntlp 2 查找文件路径 locate 文件名 如 find 文件名 如 find home 3 Linux下查看和停止所有java进程 在Linux下查看所有java进程命令 ps ef grep
  • 摄像机跟踪主角第三人称的视角

    using UnityEngine using System Collections public class FollowFarget MonoBehaviour public Transform PlayerTransfrom 定义一个
  • Unity 性能优化五:渲染模块压力

    CPU压力 Batching 在GPU渲染前 CPU会把数据按batch发送给GPU 每发送一次 都是一个drawcall GPU在渲染每个batch的时候 会切换渲染状态 这里的渲染状态指的是 影响对象在屏幕上的外观的渲染属性或材质 比如
  • OpenCV自适应阈值化函数adaptiveThreshold

    图像阈值化的一般目的是从灰度图像中分享目标区域和背景区域 然而仅仅通过设定固定阈值很难达到理想的分割效果 在实际应用中 我们可以通过某个像素的邻域以某种方法确定这个像素应该具有的阈值 进而保证图像中各个像素的阈值会随着周期围邻域块的变化而变
  • EasyExcel的简单导出

    EasyExcel的简单导出 Controller层代码 GetMapping download public void download String name HttpServletResponse response fileManag
  • 5、安全理论与框架-企业架构模型(EA)-业务组件模型(IBM CBM)

    一 背景 CBM component business model 组件化业务模型或叫业务组件模型 是IBM在2003年提出的 当时的大背景 公司内 外专业化 CBM是IBM做业务架构的一个重要方法论 就是把业务描述成一个个独立的小块 我们
  • 面试题一:前端去重方法汇总你知道多少?

    题记 我们项目中有很多的业务是需要去重的 那么下面是常用的一些去重的一些方法 用indexOf方法去重 新建一个空数组 遍历需要去重的数组 将数组元素存入新数组中 存放前判断数组中是否已经含有当前元素 没有则存入 此方法也无法对NaN去重
  • 上采样,下采样,过采样,欠采样的区别

    上下是方法 过欠是现象 上采样 upsampling 应该就是内插 补零滤波 下采样 downsampling 应该就是抽取 过采样就是采样频率大于两倍的信号最高频率 欠采样就是采样频率小于两倍的信号最高频率 欠采样失真仅仅是对基带信号而言
  • 源码编译llvm Error 记录

    cmake G Unix Makefiles llvm DLLVM ENABLE PROJECTS bolt clang clang tools extra compiler rt cross project tests libclc l
  • OceanBase:编译、安装和配置手册

    概述 OceanBase是 一个高性能的分布式表格系统 提供类似BigTable的性能和扩展性 但表格中保存的是强类型的数据 比如integer string datetime等 它使用C 编写 运行于64位Linux环境下 生产环境下需要
  • Ubuntu20.04编译安装opencv3.2和opencv_contrib-3.2

    图像特征提取中需要用到SIFT等算法 因此不得不安装从源码编译安装opencv contrib 网上有很多教程 但是在不同的环境下多少会出现一些错误 针对Ubuntu20 04 gcc 7环境下对opencv opencv contrib编