我的AI之路(11)--如何解决在Linux下编译OpenCV3时出现的多个错误

最新版的OpenCV3.4可以使用下面的命令下载,或者在浏览器中下载:

wget https://github.com/opencv/opencv/archive/3.4.1.tar.gz

由于在github上下载大文件非常慢而且经常中断,个人觉得还是用有断点续传功能的浏览器下载好。

无法忍受下载的龟速,所以网上搜了一下,csdn这里有位好同志共享了多个OpenCV版本的百度盘链接:

https://blog.csdn.net/yanzi1225627/article/details/47668021

我下载了opencv-3.2.0.zip(Linux/Mac)到本地解压后开始编译,当然你的环境中首先得安装好cmake:

dnf install cmake

然后执行:

cd opencv-3.2.0

mkdir build

cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

执行这个命令后,长时间挂住了,最后提示下载ippicv失败,这个ippicv是个并行计算库,如果不想用这个并行计算库,在做Cmake的时候用参数关闭即可,但以建议使用这个库。因为直接到原始网站下载确实非常慢,这就是为何前面下载失败了,网上搜了个ippicv_linux_20151201.tgz下载到本地,然后拷到opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e目录下,然后再执行:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

过一会儿又报下面几个错:

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)

[ 19%] Building NVCC (Device) object modules/core/CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_gpu_mat.cu.o

nvcc fatal   : Unsupported gpu architecture 'compute_20'

CMake Error at cuda_compile_generated_gpu_mat.cu.o.cmake:208 (message):

  Error generating

  /home/fychen/install/opencv-3.2.0/build/modules/core/CMakeFiles/cuda_compile.dir/src/cuda/./cuda_compile_generated_gpu_mat.cu.o

在stackoverflow上找到原因是cuda9不在支持2.0架构,需要做如下大的改动:

1)修改cmake/FindCUDA.cmake,找到 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)

     再找到行 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}")

      再找到行 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)修改cmake/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")

      ...

再修改行 set(__cuda_arch_bin "2.0 3.0 3.5 3.7 5.0 5.2 6.0 6.1") 为

set(__cuda_arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1") 

再执行上面的cmake命令,报新的错误:

saturate_cast.hpp : error: identifier "__half2float" is undefined.

这是因为cuda9中有一个单独的halffloat(cuda_fp16.h)头文件,也应该被包括在opencv的目录里,
将头文件cuda_fp16.h添加至 opencv\modules\cudev\include\opencv2\cudev\common.hpp
即在common.hpp中添加(cuda9安装在/usr/local/cuda下,include/cuda_fp16.h已在搜索路径中):

#include <cuda_fp16.h>

然后再执行上面的cmake命令,再报错:

file included from /home/fychen/install/opencv-3.2.0/modules/core/src/hal_internal.cpp:49:0:
/home/fychen/install/opencv-3.2.0/build/opencv_lapack.h:2:45: 致命错误:LAPACKE_H_PATH-NOTFOUND/lapacke.h:No such file or directory

 #include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"

安装openblas和openblas-devel: 

 dnf install openblas openblas-devel

手工修改opencv-3.2.0/build/opencv_lapack.h
#include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"
==>
#include "/usr/include/openblas/lapacke.h"

再执行cmake命令,然后报错:

/home/fychen/install/opencv-3.2.0/modules/core/include/opencv2/core/cuda/vec_math.hpp(203): error: calling a constexpr __host__ function("abs") from a __device__ function("abs") is not allowed. The experimental flag '--expt-relaxed-constexpr' can be used to allow this.

对vec_math.hpp做如下修改(把203行和205行的 ::abs 也注释掉):

CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, uchar, uchar)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::abs, char, char)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, ushort, ushort)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::abs, short, short)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::abs, int, int)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, uint, uint)
==>
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, uchar, uchar)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, char, char)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, ushort, ushort)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, short, short)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::abs, int, int)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, uint, uint)

再执行cmake和make命令,然后执行make install即完成OpenCV3的编译和安装。

我的AI之路(1)--前言

我的AI之路(2)--安装Fedora 28

我的AI之路(3)--安装Anaconda3 和Caffe

我的AI之路(4)--在Anaconda3 下安装Tensorflow 1.8

我的AI之路(5)--如何选择和正确安装跟Tensorflow版本对应的CUDA和cuDNN版本

我的AI之路(6)--在Anaconda3 下安装PyTorch

我的AI之路(7)--安装OpenCV3_Python 3.4.1 + Contrib以及PyCharm

我的AI之路(8)--体验用OpenCV 3的ANN进行手写数字识别及解决遇到的问题

我的AI之路(9)--使用scikit-learn

我的AI之路(10)--如何在Linux下安装CUDA和CUDNN

我的AI之路(11)--如何解决在Linux下编译OpenCV3时出现的多个错误

我的AI之路(12)--如何配置Caffe使用GPU计算并解决编译中出现的若干错误

我的AI之路(13)--解决编译gcc/g++源码过程中出现的错误

我的AI之路(14)--Caffe example:使用MNIST数据集训练和测试LeNet-5模型

我的AI之路(15)--Linux下编译OpenCV3的最新版OpenCV3.4.1及错误解决

我的AI之路(16)--云服务器上安装和调试基于Tensorflow 1.10.1的训练环境

我的AI之路(17)--Tensorflow和Caffe的API及Guide

我的AI之路(18)--Tensorflow的模型安装之object_detection

猜你喜欢

转载自blog.csdn.net/XCCCCZ/article/details/80953970
今日推荐