OpenCV3.3编译安装+部分问题解决

本机情况

操作系统:Ubuntu16.04
本机已安装NVIDIA显卡驱动+CUDA+cuDNN,安装方法见【安装链接

OpenCV3.3编译安装

安装准备

1.安装opencv的工具和依赖项

sudo apt-get install cmake 
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev
sudo apt-get install libavformat-dev libjpeg.dev libtiff4.dev
sudo apt-get install libswscale-dev libjasper-dev
sudo apt-get install libjpeg62-dev
sudo apt-get install v4l2ucp
sudo apt-get install v4l-utils
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

(若编译中发现缺少的依赖,使用sudo apt-get install安装即可)

2.下载opencv3.3源码(Opencv官方github账号链接)
opencv3.3源码下载链接
如果需要使用opencv_contrib的扩展功能,请在此链接下载【Opencv_contrib3.3下载链接

编译Opencv

1.将opencv-3.3.0源码(需要的可以加上opencv_contrib3.3)放到你选择安装Opencv的目录中(我放在/home下面的),并解压
unzip opencv-3.3.0.zip
unzip opencv_contrib-3.3.0.zip

2.进入opencv-3.3源码目录内,并创建build目录

cd opencv-3.3.0/
mkdir build
cd build

3.用cmake命令制作Makefile文件

 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D INSTALL_C_EXAMPLES=OFF -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=/home/desperado/opencv_contrib-3.3.0/modules  -D BUILD_SHARED_LIBS=ON -D WITH_GTK=ON -D WITH_FFMPEG=ON -D BUILD_EXAMPLES=ON -D WITH_OPENMP=ON -D CUDA_HOST_COMPILER:FILEPATH=/usr/bin/gcc-5 ..  

如果出现Configuring done和Generating done,表示生成Makefile成功。
在这里插入图片描述
作者花了很多时间在这个上面,基本都是一个错误一个错误的解决,最后才制作成功了可以编译通过的Makefile,这些后缀是用来开启或者关闭一些服务的,朋友建议我使用Cmake-Gui来制作Makefile文件,但是我还没试过,本文章先不赘述。在文章最后我会把部分错误全部。

4.编译,安装
在生成了Makefile以后,直接输入:

make -j4

以编译源码,此过程很长,遇到错误就依次解决再编译,直到通过。作者遇到的部分错误和解决方案会在后面给出。
编译成功以后,再输入以下指令安装:

sudo make install

成功以后输入以下指令查看opencv版本。

扫描二维码关注公众号,回复: 14646674 查看本文章
pkg-config --modversion opencv

有输出就表示安装成功。

5.配置路径
新建文件

sudo gedit /etc/ld.so.conf.d/opencv.conf

在文件中添加**/usr/local/lib**
然后更新配置

sudo ldconfig 

Cmake和编译过程中遇到的问题和解决方案

1.Cmake过程中遇到一大堆链接失败问题
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)
linked by target “opencv_cudev” in directory D:/Cproject/opencv/opencv/sources/modules/cudev
linked by target “opencv_cudev” in directory D:/Cproject/opencv/opencv/sources/modules/cudev
…后面还有一堆链接失败
原因:cuda版本过高,不再支持2.0架构

解决方案如下:

1).找到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)

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)

4).找到文件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")
  ...

5).cuda9中有一个单独的halffloat(cuda_fp16.h)头文件,也应该被包括在opencv的目录里

将头文件cuda_fp16.h添加至 opencv\modules\cudev\include\opencv2\cudev\common.hpp

即在common.hpp中添加

#include <cuda_fp16.h>

最后重新cmake即可 。

2.各类缺少包的问题

缺少的包											解决方法
-- No package 'gtk+-3.0' found          		sudo apt-get install libgtk-3-dev
-- No package 'gstreamer-base-1.0' found		sudo apt-get -y install libgstreamer-plugins-base1.0-dev
-- No package 'gstreamer-video-1.0' found 
-- No package 'gstreamer-app-1.0' found
-- No package 'gstreamer-riff-1.0' found		(这四个装下面这个包)
-- No package 'gstreamer-pbutils-1.0' found		sudo apt-get -y install libgstreamer1.0-dev
-- No package 'libavresample' found				sudo apt-get -y install libavresample-dev
-- No package 'libgphoto2' found				sudo apt-get -y install libgphoto2-dev

3.找不到一些库
(1)

-- Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
-- Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
-- Could NOT find Atlas (missing:  Atlas_CBLAS_INCLUDE_DIR Atlas_CLAPACK_INCLUDE_DIR 	Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY Atlas_LAPACK_LIBRARY) 
-- Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE) 
-- Could NOT find JNI (missing:  JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) 
-- Could NOT find Matlab (missing:  MATLAB_MEX_SCRIPT MATLAB_INCLUDE_DIRS 		MATLAB_ROOT_DIR MATLAB_LIBRARIES MATLAB_LIBRARY_DIRS MATLAB_MEXEXT MATLAB_ARCH MATLAB_BIN) 
-- VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file

解决方法:

sudo apt-get install libopenblas-dev

(2)

-- Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE)

解决方法

sudo apt-get install doxygen

(3)

-- Could NOT find JNI (missing:  JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) 

解决方法
a.下载jdk-8u151-linux-x64.tar.gz到download目录
http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html

b.安装jdk

$ cd download/
$ sudo mkdir /usr/local/java
$ sudo tar zxvf jdk-8u151-linux-x64.tar.gz -C /usr/local/java
$ sudo ln -s /usr/local/java/jdk1.8.0_151/ /usr/local/java/latest

c. 添加环境变量:

$ sudo gedit /etc/profile

加入如下内容:

>export JAVA_HOME=/usr/local/java/latest
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

更新环境变量

$ source /etc/profile

4.下载包超时(需手动下载)

  ICV: Failed to download ICV package: ippicv_linux_20151201.tgz.
  Status=28;"Timeout was reached"

手动下载 ippicv_2017u2_lnx_intel64_20170418.tgz【不同版本下载链接】到opencv-3.2.0/3rdparty/ippicv/downloads/目录下再cmake

5.在CMakeError.log里出现:

C++11 is not supported

解决方法:
安装g++5,并在cmake命令后缀里加上

-D CUDA_HOST_COMPILER:FILEPATH=/usr/bin/gcc-5

6.编译OpenCV项目时出现的undefined reference to cv::xxxx
编译时使用命令

g++ main.cpp -o test `pkg-config --cflags --libs opencv`

其他问题记不太清了,反正遇到问题就依次解决。

参考文献:
1.ubuntu+OpenCV3.3.0+CUDA配置详情
2.OpenCV3.3+CUDA9.0+Cmake3.9 环境搭建
3.ubuntu16.04 安装opencv 步骤和错误解决

猜你喜欢

转载自blog.csdn.net/qq_39839546/article/details/107427546