【CUDA加速DNN】【CSI摄像头】Jetson nano使用记录之源代码编译安装opencv4.5.1

Jetson nano使用记录之源代码编译安装opencv4.5.1

Jetson nano官方镜像自带的opencv版本是4.1系列的,为了更加舒适的使用opencv的dnn模块进行目标检测的应用我们需要把opencv的版本提高一些,这里我使用的是opencv4.5.1版本,并通过源代码进行安装。
安装前需要准备的步骤参照官方说明针对Jetson TX1的说明
opencv4.5.1-JetsonTX1
首先需要下载opencv的源码,可以选择下载扩展包衣方便未来的学习。
github下载
【CUDA加速DNN】【CSI摄像头】Jetson nano使用记录之源代码编译安装opencv4.5.1_第1张图片
把源码下载好之后解压缩并且将文件目录结构保持相同

卸载原有opencv

这里我们需要将原来的opencv卸载干净,使用指令

sudo apt-get purge libopencv*
sudo apt-get update

这里值得注意的是有很多的博客都用了sudo apt autoremove这个指令,这个命令会把系统里一些卸载opencv之后的无关软件包一同卸载,这样大概率在后期的使用中会出现问题,所以不建议这样做。

更新pip

原系统应该是已经安装pip3的,这里需要更新一下pip3并且换源。

pip3 install --upgrade pip

永久换源:

mkdir ~/.pip
cd ~/.pip
touch pip.conf
sudo gedit ~/.pip/pip.conf

写入以下内容:

[global] 
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install] 
trusted-host=pypi.tuna.tsinghua.edu.cn

国内常用的源,可以自行切换使用:

https://mirrors.aliyun.com/pypi/simple				#阿里
https://pypi.mirrors.ustc.edu.cn/simple/			#中科大
https://pypi.tuna.tsinghua.edu.cn/simple			#清华

更新numpy

这里一定要注意,更新numpy时不要直接安装新版numpy,一定要先卸载原有的numpy,否则多个numpy的版本存留在系统中很容易出现核心已转储的错误。

sudo pip3 uninstall numpy
pip3 list
#检查numpy是否已经被卸载
pip3 install numpy==1.18.4

编译安装opencv

在正式开始编译安装之前需要确保已经安装CMake。
使用指令安装以下支持包:

$ sudo apt-get install \
    libglew-dev \
    libtiff5-dev \
    zlib1g-dev \
    libjpeg-dev \
    libpng12-dev \
    libjasper-dev \
    libavcodec-dev \
    libavformat-dev \
    libavutil-dev \
    libpostproc-dev \
    libswscale-dev \
    libeigen3-dev \
    libtbb-dev \
    libgtk2.0-dev \
    pkg-config

再执行指令检查并安装python3环境:

sudo apt-get install python3-dev python3-numpy python3-py python3-pytest

完成该步骤之后,终端进入opencv-4.5.1文件路径下,创建build文件夹用于编译以及存放中间文件。

mkdir build
cd build

添加xfeatures2d缺少文件

在执行cmake指令之前,如果你需要编译opencv_contrib包,则还需要将一些缺失文件手动补充,不然后期会报错。
在这里插入图片描述【CUDA加速DNN】【CSI摄像头】Jetson nano使用记录之源代码编译安装opencv4.5.1_第2张图片
【CUDA加速DNN】【CSI摄像头】Jetson nano使用记录之源代码编译安装opencv4.5.1_第3张图片
这里展示的两个文件夹下的共11个文件需要下载到jetson上,手动复制粘贴到opencv_contrib包下的../opencv_contrib/modules/xfeatures2d/src路径下,注意是直接把11个文件复制进去,不要保留原有的两个文件夹。

增加交换空间

开始编译之前还需要增加swap交换空间,避免应为jetson内存太小导致的编译停止。我是4G版本的nano,交换空间增加了4G。对于交换空间,其原理大概是将一部分存储空间拿来做临时的数据存放空间,差不多就是虚拟内存的概念,这对SD卡的读写速度和质量有一定的要求。

sudo fallocate -l 4G /var/swapfile
sudo chmod 600 /var/swapfile
sudo mkswap /var/swapfile
sudo swapon /var/swapfile

开始CMAKE

然后执行cmake指令:注意以下指令建议先拷贝到一个txt文件中,删除注释之后在粘贴到终端中

cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr/loca  \  #不要随便修改安装路径,不然python3无法正常索引,手动添加索引路径很麻烦
    -DBUILD_PNG=ON \ 	#使能两个常用的图片格式
    -DBUILD_TIFF=OFF \
    -DBUILD_TBB=OFF \
    -DBUILD_JPEG=ON \
    -DBUILD_JASPER=OFF \
    -DBUILD_ZLIB=OFF \
    -DBUILD_EXAMPLES=OFF \	#不编译例程,这可以加快编译的速度
    -DBUILD_JAVA=OFF \
    -DBUILD_opencv_python2=OFF \
    -DBUILD_opencv_python3=ON \	#编译python3的库
    -DENABLE_PRECOMPILED_HEADERS=OFF \
    -DENABLE_NEON=ON \
    -DWITH_OPENCL=OFF \
    -DWITH_OPENMP=OFF \
    -DWITH_FFMPEG=ON \
    -DWITH_GSTREAMER=ON \		#使能CSI硬件管道	如果要在opencv使用Jetson的CSI摄像头的话这两个指令一定要加上并打开
    -DWITH_GSTREAMER_0_10=ON \	#使能CSI硬件管道
    -DWITH_CUDA=ON \
    -DWITH_CUDNN=ON \    #如果要在dnn模块中使用CUDA加速,需要打开该指令
    -DOPENCV_DNN_CUDA=ON \	 #如果要在dnn模块中使用CUDA加速,需要打开该指令
    -DENABLE_FAST_MATH=1 \  #计算加速,建议打开这个指令,但是这会让编译时间增加
    -DCUDA_FAST_MATH=1  \  #CUDA加速
    -DWITH_GTK=ON \
    -DWITH_VTK=OFF \
    -DWITH_TBB=ON \
    -DWITH_1394=OFF \
    -DWITH_OPENEXR=OFF \
    -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.2 \
    -DCUDA_ARCH_BIN=5.3 \
    -DCUDA_ARCH_PTX="" \
    -DINSTALL_C_EXAMPLES=OFF \
    -DINSTALL_TESTS=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.5.1/modules\	#指定opencv_contrib扩展包的路径,这里需要检查和你自己的路径相同
    ..

在正式开始编译之前,记得查看以下交换空间有没有生效:使用jtop工具,产看cup,gup,内存使用情况

sudo -H pip install jetson-stats
sudo jtop

确定正常之后退出jtop或者Ctrl+C终止。

编译

确保此时jetson上除了一个终端以外没有其它程序在运行,例如浏览器应该关闭。将终端cd到前面创建的build路径下。

make -j8

关于报错

等待编译完成。一般需要5-6个小时左右,中途有报错不要慌乱,一般会出现的错误就是找不到文件,这个时候我们可以对应的在opencv包或者opencv_contrib包中找到那个文件然后手动拷贝到报错的地方去,继续执行make -j8继续编译。有时候可能会有部分情况是找不到头文件,就是#include.....的错误,这个时候如果发现对应的头文件是确定在,但make找不到的情况下可以把#include“ … ”中头文件的路径从相对路径改为文件的绝对路径继续编译。
如果提示这样的报错:

CMakeFiles/example_gpu_surf_keypoint_matcher.dir/surf_keypoint_matcher.cpp.o:在函数‘main’中:
surf_keypoint_matcher.cpp:(.text.startup.main+0x1f0):对‘cv::cuda::SURF_CUDA::SURF_CUDA()’未定义的引用
surf_keypoint_matcher.cpp:(.text.startup.main+0x2e0):对‘cv::cuda::SURF_CUDA::operator()(cv::cuda::GpuMat const&, cv::cuda::GpuMat const&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, bool)’未定义的引用
surf_keypoint_matcher.cpp:(.text.startup.main+0x338):对‘cv::cuda::SURF_CUDA::operator()(cv::cuda::GpuMat const&, cv::cuda::GpuMat const&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, bool)’未定义的引用
surf_keypoint_matcher.cpp:(.text.startup.main+0x3c0):对‘cv::cuda::SURF_CUDA::defaultNorm() const’未定义的引用
surf_keypoint_matcher.cpp:(.text.startup.main+0x468):对‘cv::cuda::SURF_CUDA::downloadKeypoints(cv::cuda::GpuMat const&, std::vector >&)’未定义的引用
surf_keypoint_matcher.cpp:(.text.startup.main+0x480):对‘cv::cuda::SURF_CUDA::downloadKeypoints(cv::cuda::GpuMat const&, std::vector >&)’未定义的引用
surf_keypoint_matcher.cpp:(.text.startup.main+0x490):对‘cv::cuda::SURF_CUDA::downloadDescriptors(cv::cuda::GpuMat const&, std::vector >&)’未定义的引用
surf_keypoint_matcher.cpp:(.text.startup.main+0x4a0):对‘cv::cuda::SURF_CUDA::downloadDescriptors(cv::cuda::GpuMat const&, std::vector >&)’未定义的引用
collect2: error: ld returned 1 exit status
samples/gpu/CMakeFiles/example_gpu_surf_keypoint_matcher.dir/build.make:121: recipe for target 'bin/example_gpu_surf_keypoint_matcher' failed


--as-needed CMakeFiles/example_gpu_surf_keypoint_matcher.dir/surf_keypoint_matcher.cpp.o ../../modules/xfeatures2d/CMakeFiles/opencv_xfeatures2d.dir/src/surf.cuda.cpp.o ../../modules/xfeatures2d/CMakeFiles/cuda_compile_1.dir/src/cuda/cuda_compile_1_generated_surf.cu.o

解决办法如下:

在build/samples/gpu/CMakeFiles/example_gpu_surf_keypoint_matcher.dir/link.txt这个文件里找到这句话:
"--as-needed CMakeFiles/example_gpu_surf_keypoint_matcher.dir/surf_keypoint_matcher.cpp.o"替换成这一句:
--as-needed CMakeFiles/example_gpu_surf_keypoint_matcher.dir/surf_keypoint_matcher.cpp.o ../../modules/xfeatures2d/CMakeFiles/opencv_xfeatures2d.dir/src/surf.cuda.cpp.o ../../modules/xfeatures2d/CMakeFiles/cuda_compile_1.dir/src/cuda/cuda_compile_1_generated_surf.cu.o

然后继续编译

安装

在看到编译100%完成后就可以安装了,在build路径下

sudo make install

安装完之后就可以正常使用你的opencv啦。

额外话:关于非法指令核心转储修正的报错

相信你在入门jetson的时候一定有遇到这个错误,这个错误大多时候是应为包重复或者包版本有错导致的。但也有少数情况下,包没错,版本也没错,还是报错,可以尝试这样解决’

OPENBLAS_CORETYPE=ARMV8 python

也可以设置开机自动执行命令:

sudo vi ~/.bashrc
export OPENBLAS_CORETYPE=ARMV8
source ~/.bashrc

以上就是全部内容,如果有帮助到你的话,点个赞吧!

你可能感兴趣的:(嵌入式,目标检测)