Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CentOS7下OpenCV2+CUDA9的编译问题解决

CentOS7下OpenCV2+CUDA9的编译问题解决

原创
作者头像
netkiddy
修改于 2018-12-03 13:57:35
修改于 2018-12-03 13:57:35
3.3K20
代码可运行
举报
文章被收录于专栏:非典型程序猿非典型程序猿
运行总次数:0
代码可运行

导言

OpenCV是一个基于(开源)发行的跨平台计算机视觉库。CUDA是由NVIDIA所推出的一种集成技术,透过这个技术,用户可利用NVIDIA的GeForce 8以后的GPU和较新的QuadroGPU进行计算。本文将不涉及OpenCV或者CUDA的更多介绍和使用,主要是提供了对特定版本编译时遇到问题的解决方案。

背景

日前一个项目中的算法部分,一直是依赖于OpenCV2和CUDA8,在项目测试阶段也是完美通过。可在正式上线的时候却在编译OpenCV就一直出错,查到最后才发现生产机器的CUDA版本被人给「偷偷」升级到了CUDA9,也是因此踏上了一条填坑路,记录于下,以被自己所需和他人使用。

如果你是一台全新的环境,当然是按照需要的环境来安装,比如旧版本的OpenCV2 + CUDA8,或者是最新版本的OpenCV4+CUDA10这样的搭配,那么也就不需要再继续阅读下面的内容,因为理论上不会遇到下面的问题。

但是,如果你是在一台已有的环境,且被安装了CUDA9,同时你的代码又依赖于OpenCV2,那么你一定遇到了同样的问题,通过阅读这边文章,你就可以完美的编译并运行你的代码了。

问题

在CUDA9下,我们编译OpenCV2的时候,会遇到了不少报错,主要原因是而相对于CUDA8,在CUDA9中的修改主要是2点:

nppi命名规范

在CUDA9里面,NVIDIA把 libnppi.so换成libnppc.so libnppial.so libnppicc.so libnppicom.so libnppidei.so libnppif.so libnppig.so libnppim.so libnppist.so libnppisu.so libnppitc.so libnpps.so

架构支持

CUDA9.x+里面不支持compute_20 (Fermi)

操作

OpenCV编译

替换cmake

我们在编译OpenCV2时遇到了报错,提示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nvcc fatal : Unsupported gpu architecture 'compute_20'

这时候,在OpenCV2解压后的{OPENCV_CODE_PATH}/cmake/目录下找到这两个文件:

  • FindCUDA.cmake
  • OpenCVDetectCUDA.cmake

并使用下文中的直接完整替代(可先备份旧文件)

opencv2.4 with CUDA9 patch

上文中,主要是修复了针对问题1和2的修复(如果希望了解具体的替换内容,可参考此链接)。

未知arch时的二次修改

需要注意的是,当我们根据上文进行更改之后,在cmake时需要通过-DCUDA_GENERATION=xxx来指定CUDA的generation信息(如"Fermi" "Kepler" "Maxwell" "Pascal" "Volta")。如果不指定的话,在cmake时OpenCVDetectCUDA.cmake会基于上述所有已知架构完整编译,也是因此,会尝试编译Fermi架构并出现同样的Unsupported gpu architecture错误。

所以,如果我们未知上述的CUDA GENERATION信息的话,需要对OpenCVDetectCUDA.cmake文件再做两处修改,去除关于compute_20 arch的编译信息,因为如上文所说:CUDA9中不再支持2.0框架:

1. 删除Fermi架构的编译分支选项,将下文:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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") 
  elseif(CUDA_GENERATION STREQUAL "Maxwell")
    set(__cuda_arch_bin "5.0 5.2")

替换为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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")

2. 针对CUDA版本9(大于cmake中的6.5),删除2.x的arch信息,将:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(${CUDA_VERSION} VERSION_LESS "5.0")
        set(__cuda_arch_bin "1.1 1.2 1.3 2.0 2.1(2.0) 3.0")
      elseif(${CUDA_VERSION} VERSION_GREATER "6.5")
        set(__cuda_arch_bin "2.0 2.1(2.0) 3.0 3.5")
      else()
        set(__cuda_arch_bin "1.1 1.2 1.3 2.0 2.1(2.0) 3.0 3.5")
      endif()

替换为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(${CUDA_VERSION} VERSION_LESS "5.0")
        set(__cuda_arch_bin "1.1 1.2 1.3 2.0 2.1(2.0) 3.0")
      elseif(${CUDA_VERSION} VERSION_GREATER "6.5")
        set(__cuda_arch_bin "3.0 3.5")
      else()
        set(__cuda_arch_bin "1.1 1.2 1.3 2.0 2.1(2.0) 3.0 3.5")
      endif()

头文件包含

最后一步,根据 CUDA 9.0 manual所说:

Unsupported Features General CUDA ‣ CUDA library. The built-in functions __float2half_rn() and __half2float() have been removed. Use equivalent functionality in the updated fp16 header file from the CUDA toolkit.

因此我们需要在OpenCV中common.hpp里单独添加该头文件(在{OPENCV_CODE_PATH}目录下通过find命令找到该文件)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <cuda_fp16.h>

这时候,我们再次创建编译子目录{OPENCV_CODE_PATH}/mybuild/,并重新进行一次完整的opencv编译操作(在cmake时不必再指定-DCUDA_GENERATION参数了),就可以完美通过了。

链接问题

经过上述的操作,OpenCV的编译环节应该没有任何问题了。然而,在编译我们自己项目代码的时候,依然会遇到链接报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/usr/bin/ld: cannot find -lopencv_dep_nppial
/usr/bin/ld: cannot find -lopencv_dep_nppicc
/usr/bin/ld: cannot find -lopencv_dep_nppicom
/usr/bin/ld: cannot find -lopencv_dep_nppidei
/usr/bin/ld: cannot find -lopencv_dep_nppif
/usr/bin/ld: cannot find -lopencv_dep_nppig
/usr/bin/ld: cannot find -lopencv_dep_nppim
/usr/bin/ld: cannot find -lopencv_dep_nppist
/usr/bin/ld: cannot find -lopencv_dep_nppisu
/usr/bin/ld: cannot find -lopencv_dep_nppitc
collect2: error: ld returned 1 exit status

这是因为,如我们上文所说,在CUDA9中更改了nppi的命名规范,这时候,我们需要去CUDA9的lib下找到对应的so文件,并建立正确的软链接。在我的机器上,CUDA9的lib库路径为/usr/local/cuda-9.0/lib64/,遇到同样问题的朋友,可以找到自己机器伤的PATH并替换下面的命令,再执行软连接操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ln -s {CUDA9_LIB_PATH}/libnppial.so /usr/local/lib/libopencv_dep_nppial.so
 ln -s {CUDA9_LIB_PATH}/libnppicc.so /usr/local/lib/libopencv_dep_nppicc.so
 ln -s {CUDA9_LIB_PATH}/libnppicom.so /usr/local/lib/libopencv_dep_nppicom.so
 ln -s {CUDA9_LIB_PATH}/libnppidei.so /usr/local/lib/libopencv_dep_nppidei.so
 ln -s {CUDA9_LIB_PATH}/libnppif.so /usr/local/lib/libopencv_dep_nppif.so
 ln -s {CUDA9_LIB_PATH}/libnppig.so /usr/local/lib/libopencv_dep_nppig.so
 ln -s {CUDA9_LIB_PATH}/libnppim.so /usr/local/lib/libopencv_dep_nppim.so
 ln -s {CUDA9_LIB_PATH}/libnppist.so /usr/local/lib/libopencv_dep_nppist.so
 ln -s {CUDA9_LIB_PATH}/libnppisu.so /usr/local/lib/libopencv_dep_nppisu.so
 ln -s {CUDA9_LIB_PATH}/libnppitc.so /usr/local/lib/libopencv_dep_nppitc.so

通过上述操作,再重新编译我们的代码,这次就全部没有问题了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
2 条评论
热度
最新
是在cmake/OpenCVModule.cmake这里定义的: ocv_add_module(yaom INTERNAL opencv_core opencv_highgui opencv_flann OPTIONAL opencv_gpu)macro(ocv_add_module _name) string(TOLOWER "${_name}" name) set(the_module opencv_${name})。opencv npp的库都加上了opencv_这个前缀
是在cmake/OpenCVModule.cmake这里定义的: ocv_add_module(yaom INTERNAL opencv_core opencv_highgui opencv_flann OPTIONAL opencv_gpu)macro(ocv_add_module _name) string(TOLOWER "${_name}" name) set(the_module opencv_${name})。opencv npp的库都加上了opencv_这个前缀
回复回复点赞举报
我遇到的问题是,opencv可以正常编译过去,用ldd查看,已经连接到/usr/local/cuda9.0/ 下面的npp库,可是,当其它程序编译,连接opencv库的时候,就会报错 /usr/bin/ld: cannot find -lopencv_dep_nppial, 等几条,为什么呢?
我遇到的问题是,opencv可以正常编译过去,用ldd查看,已经连接到/usr/local/cuda9.0/ 下面的npp库,可是,当其它程序编译,连接opencv库的时候,就会报错 /usr/bin/ld: cannot find -lopencv_dep_nppial, 等几条,为什么呢?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
OpenCV学习一《Linux下安装OpenCV》
需要的编译环境 ■ [compiler] sudo apt-get install build-essential
梅花
2020/09/28
1.7K0
OpenCV学习一《Linux下安装OpenCV》
Yuzuki Lizard V851S开发板 –编译 OPENCV 4.5.4
https://blog.csdn.net/Flag_ing/article/details/109508374
阿志小管家
2024/02/02
2660
Yuzuki Lizard V851S开发板 –编译 OPENCV 4.5.4
ubuntu18.04下编译OpenCV3.4.9
OpenCV源码下载地址: https://opencv.org/releases/
DS小龙哥
2022/01/12
4870
ubuntu18.04下编译OpenCV3.4.9
笔记---Linux安装OpenCV及VSCode的配置编译
最近在学点新东西,教程中主要也是在Linux中使用,对于我这个以前从未接触Linux系统的人来说,正好也是个机会掌握下LInux系统。这篇就是记录在Linux下安装OpenCV的笔记。
Vaccae
2021/12/28
4.9K0
笔记---Linux安装OpenCV及VSCode的配置编译
【安装教程】Ubuntu16.04+Caffe+英伟达驱动410+Cuda10.0+Cudnn7.5+Python2.7+Opencv3.4.6安装教程
对于caffe的安装过程,可以说是让我终身难忘。两个星期就为了一个caffe,这其中的心路历程只有自己懂。从实验室的低配置显卡开始装Ubuntu,到编译caffe,解决各种报错,这个过程花费了一周的时间。把cuda版本和N卡驱动版本一降再降,仍然不管用。因此手剁了一台8000的高配置主机。之后为了平衡实验室项目,首先花了半天时间将win10下的相关和其他杂七杂八的软件配置。只有以为只需Ubuntu安装好,caffe编译成功即可,不想安装完Ubuntu之后,却电脑没有引导启动项,把网上的方法试了个遍,却仍无法解决。因此听到一种说法是,win10的启动路径覆盖了Ubuntu启动路径。因此,决定重新再来,将自己的固态和机械全部初始化,首先在固态上安装Ubuntu16.04,在机械上安装Win10,对于双系统的安装请参照我的另一篇博客:Win10与Ubuntu16.04双系统安装教程。在这种情况下参加那个caffe安装成功。请注意,对于双系统建议先安装Ubuntu,并将caffe编译成功之后在去机械上安装Win10。Caffe的安装教程请参照如下安装教程。
AI那点小事
2020/04/20
1.9K0
【安装教程】Ubuntu16.04+Caffe+英伟达驱动410+Cuda10.0+Cudnn7.5+Python2.7+Opencv3.4.6安装教程
为OPENCV添加freetype支持并显示中文字符(在mac上编译opencv及contrib库)
  在mac电脑上管理这些gnu的库一般都使用Homebrew,但总有一些你个性化的需要是官方的Homebrew配方无法满足的。比如在屏幕的输出中使用中文字符。   在OPENCV中输出UTF8字符集早已经有人完成过类似的工作,方法是使用freetype的支持,程序中选择使用的字库,从而在屏幕上输出任意的字符。但官方的Homebrew OPENCV的配方中,并不包含freetype的支持。这时候,只好自己来编译OPENCV及contrib库,因为freetype的支持就在contrib库中。
俺踏月色而来
2018/10/11
5.5K0
为OPENCV添加freetype支持并显示中文字符(在mac上编译opencv及contrib库)
编译FFMpeg n4.2.5、OpenCV-3.4.16、OpenCV-4.5.4
做测试时需要用OpenCV。虽然网络上有大量的关于编译OpenCV的教程,但是还是遇到了问题。因此记录了编译的过程,希望以后能更加顺利。
hankfu
2021/12/10
2.5K0
Ubuntu下OpenCV安装使用简述
Opencv就不解释了,是个很有名的图形库。不仅在进行软件开发的过程中需要用到,而且他也是很多开源软件的运行依赖,所以安装一个Opencv就很有必要了,即使自己本身并不想学习使用。
mythsman
2022/11/14
4930
Develop with OpenCV on Mac
本文介绍如何在Mac OS X上进行OpenCV项目的开发,尝试的开发工具有Xcode(版本是4.6.1)和Eclipse,使用的OpenCV版本是2.4.6。
宅男潇涧
2018/08/01
8720
OpenCV开发:ubuntu18.04下交叉编译OpenCV3.4.9到ARM64位平台RK3399(aarch64-linux-)
OpenCV源码下载地址: https://opencv.org/releases/
DS小龙哥
2022/01/12
2.1K0
OpenCV开发:ubuntu18.04下交叉编译OpenCV3.4.9到ARM64位平台RK3399(aarch64-linux-)
Jetson Xavier NX 安装 opencv with cuda
默认使用 jetpack 安装的 opencv 是没有 cuda 加速的,无法充分利用 Jetson 的 GPU 性能;
Librant
2024/06/23
7180
Jetson Xavier NX 安装 opencv with cuda
Mac下Caffe安装
下载地址:https://developer.nvidia.com/cuda-toolkit-archive,本文采用的是CUDA 7.5版本。下载安装之后,需要配置环境变量,编辑/etc/profile',添加PATH=$PATH:/Developer/NVIDIA/CUDA-7.5/bin`。
Tyan
2019/05/25
1.6K0
Linux Qt配置opencv环境(一)
今天主体是Linux 环境下配置opencv环境,如有不妥的地方,恳请大家指正。根据网上的教程并结合自己的实际操作——总结如下:
用户5908113
2020/05/11
6.5K0
【教程】Jetson安装PyQt5和CUDA版OpenCV
编译报错:nvcc fatal : Unsupported gpu architecture 'compute_87
小锋学长生活大爆炸
2024/05/28
3850
【教程】Jetson安装PyQt5和CUDA版OpenCV
编译报错:nvcc fatal : Unsupported gpu architecture 'compute_87
小锋学长生活大爆炸
2024/05/25
2550
【教程】Jetson安装PyQt5和CUDA版OpenCV
利用VScode和cmake编译构建C++工程代码
可能我们有时候已经习惯了使用大型IDE去编写一些C++工程,经常使用大型IDE例如VS、Clion、VC++6.0,这些大型的软件都已经为我们提供好了编译链接工具,我们不需要自己去手动设置编译器,也不需要了解相关知识就可以写代码进行编译运行。
老潘
2023/10/19
1.4K0
利用VScode和cmake编译构建C++工程代码
第10节 libtorch与torchvision交叉编译(ARM与安卓 ios)
libtorch cross compile on aarch64-linux-gnu-gcc include torchvision
AI拉呱
2022/09/21
2K0
Jetson TX1开发笔记(五):TX1使用OpenCV3.1实时采集视频图像
本文介绍了Jetson TX1开发笔记(五),主要讲述了使用OpenCV3.1和CUDA7.5,在Jetson TX1上实时图像采集和处理的过程。作者依次介绍了环境搭建、OpenCV3.1编译、CUDA7.5编译、摄像头采集、图像处理、图像显示、以及创建简单的摄像头程序。在编译过程中遇到的一些问题和解决方法也进行了介绍。
Jack_Cui
2018/01/08
1K0
Jetson TX1开发笔记(五):TX1使用OpenCV3.1实时采集视频图像
【杂谈】手把手带你配置深度学习环境
要想AI学的好,那就得linux系统用的好。放弃windows系统,只用linux系统是你学习AI,或者说做一个合格程序猿的基础。今天就手把手教大家如何在linux系统上配置OpenCV和Caffe,这也是大家在学习过程中,最让人头疼的两个环境。
用户1508658
2019/08/06
7630
Caffe框架整理
Caffe框架下载地址:https://github.com/BVLC/caffe
算法之名
2023/11/08
2050
推荐阅读
相关推荐
OpenCV学习一《Linux下安装OpenCV》
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验