Ubuntu18.04+ROS Melodic+CUDA10.2+Opencv3.2.0+Opencv_contrib-3.2.0环境配置

1、主机环境

显卡:NVIDIA GeForce GT 730(GK208B,Kepler架构,最高支持Cuda10.2)

CPU:Intel® Core™ i5-10500 CPU @ 3.10GHz × 12

系统:Ubuntu18.04.6 LTS

驱动:470.103.01

CUDA:10.2.89

ROS:Melodic

2、源码下载

opencv-3.2.0下载地址:GitHub - opencv/opencv at 3.2.0Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.https://github.com/opencv/opencv/tree/3.2.0opencv_contrib-3.2.0下载地址:

GitHub - opencv/opencv_contrib at 3.2.0Repository for OpenCV's extra modules. Contribute to opencv/opencv_contrib development by creating an account on GitHub.https://github.com/opencv/opencv_contrib/tree/3.2.0

3、代码修改

~/opencv-3.2.0/cmake/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)

~/opencv-3.2.0/cmake/OpenCVDetectCUDA.cmake

1)找到

  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")

~/opencv3.2.0/modules/cudev/include/opencv2/cudev/common.hpp

1)添加

#include 

4、编译

cd ~/opencv-3.2.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE   -D CMAKE_INSTALL_PREFIX=/usr/local/opencv320 -D WITH_TBB=ON -D WITH_V4L=ON   -D WITH_QT=ON   -D WITH_OPENGL=ON   -D WITH_CUDA=ON   -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1   -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES"   -D WITH_CUBLAS=1 -D OPENCV_EXTRA_MODULES_PATH=/home/rust/Env/opencv_320/opencv_contrib-3.2.0/modules -D CUDA_GENERATION=Kepler -D OPENCV_ENABLE_NONFREE=True -D ENABLE_PRECOMPILED_HEADERS=OFF ..

make -j8
sudo make install

注:

-D CMAKE_INSTALL_PREFIX=/usr/local/opencv320  此选项为设置opencv安装路径

-D OPENCV_EXTRA_MODULES_PATH=/home/rust/Env/opencv_320/opencv_contrib-3.2.0/modules  此选项为opencv_contrib-3.2.0中modules的文件夹路径

-D WITH_CUDA=ON  此选项为联合CUDA编译

5、缺少文件

博主自己编译的时候,是有科学上网环境的,所以没有遇到下载不了文件的情况,但是很多同学可能没有这样的环境,所以这里提供一个资源,供大家使用

链接: https://pan.baidu.com/s/1GKiWUDXgYwc9AGergzAs-w  密码: gbfc

下载好的文件需放到 ~/opencv_contrib-3.2.0/modules/xfeatures2d/src 目录下

并且注释掉 ~/opencv_contrib-3.2.0/modules/xfeatures2d/CMakeList.txt 中的最后两行,然后保存

接着重新cmake即可

6、测试

进入 ~/opencv-3.2.0/samples/cpp/example_cmake/ 目录下,终端打开,依次输入:

cmake .
make
./opencv_example

如果电脑上插着USB摄像头,那么现在就会看到画面窗口

7、链接

1)打开文件

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

2)输入以下内容并保存

/usr/local/opencv320/lib

3)更新文件

sudo ldconfig

4)打开文件

sudo vim /etc/bash.bashrc

5)末尾输入以下内容并保存

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv320/lib/pkgconfig
export PKG_CONFIG_PATH

6)执行更新

sudo updatedb

8、其他问题

1)fatal error: LAPACKE_H_PATH-NOTFOUND/lapacke.h: No such file or directory

首先

sudo apt install liblapacke-dev checkinstall

然后找到 build 文件夹下的 opencv_lapack.h 头文件,将里面的

#include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"

替换为

#include "lapacke.h"

9、链接ROS

1)首先备份 cv_birdgeconfig.cmake 文件

sudo cp /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake.bak

2)打开 cv_birdgeconfig.cmake 文件

sudo gedit /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake

3)编辑 cv_birdgeconfig.cmake 文件中的三处地方

找到

if(NOT "include;/usr/include;/usr/include/opencv " STREQUAL " ")

替换为

if(NOT "include;/usr/local/opencv320/include/opencv2;/usr/local/opencv320/include/opencv " STREQUAL " ")

找到

set(_include_dirs "include;/usr/include;/usr/include/opencv")

替换为

set(_include_dirs "include;/usr/local/opencv320/include/opencv2;/usr/local/opencv320/include/opencv;/usr/local/opencv320/include;/usr/include")

找到

set(libraries "cv_bridge;/usr/lib/aarch64-linux-gnu/libopencv_core.so.3.2.0;/usr/lib/aarch64-linux-gnu/libopencv_imgproc.so.3.2.0;/usr/lib/aarch64-linux-gnu/libopencv_imgcodecs.so.3.2.0")

替换为

set(libraries "cv_bridge;/usr/local/opencv320/lib/libopencv_core.so.3.2.0;/usr/local/opencv320/lib/libopencv_imgproc.so.3.2.0;/usr/local/opencv320/lib/libopencv_imgcodecs.so.3.2.0")

保存退出即可

注意:通过这种方式编译出的ros包不能够正常使用 imshow() 函数,原因尚不清楚,欢迎有缘人解答

你可能感兴趣的:(ROS,opencv,计算机视觉)