【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下载
请添加图片描述
把源码下载好之后解压缩并且将文件目录结构保持相同

卸载原有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包,则还需要将一些缺失文件手动补充,不然后期会报错。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
这里展示的两个文件夹下的共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<cv::KeyPoint, std::allocator<cv::KeyPoint> >&)’未定义的引用
surf_keypoint_matcher.cpp:(.text.startup.main+0x480):对‘cv::cuda::SURF_CUDA::downloadKeypoints(cv::cuda::GpuMat const&, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >&)’未定义的引用
surf_keypoint_matcher.cpp:(.text.startup.main+0x490):对‘cv::cuda::SURF_CUDA::downloadDescriptors(cv::cuda::GpuMat const&, std::vector<float, std::allocator<float> >&)’未定义的引用
surf_keypoint_matcher.cpp:(.text.startup.main+0x4a0):对‘cv::cuda::SURF_CUDA::downloadDescriptors(cv::cuda::GpuMat const&, std::vector<float, std::allocator<float> >&)’未定义的引用
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

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

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
首先,在Jetson Nano上安装OpenCV的依赖项: ``` sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev ``` 然后,从OpenCV官网下载源代码并解压缩。接下来,打开终端并进入解压后的目录。 在终端中输入以下命令: ``` mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D CUDA_ARCH_BIN=5.3 -D CUDA_ARCH_PTX="" -D WITH_CUBLAS=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUDNN=ON -D OPENCV_DNN_CUDA=ON -D ENABLE_NEON=ON -D WITH_QT=OFF -D WITH_OPENMP=ON -D WITH_OPENGL=ON -D BUILD_TIFF=ON -D WITH_FFMPEG=ON -D WITH_PNG=ON -D WITH_JPEG=ON -D BUILD_JPEG=ON -D BUILD_ZLIB=ON -D BUILD_EXAMPLES=OFF -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=ON -D PYTHON_DEFAULT_EXECUTABLE=$(which python3) -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D OPENCV_ENABLE_NONFREE=ON -D INSTALL_PYTHON_EXAMPLES=OFF -D INSTALL_C_EXAMPLES=OFF -D OPENCV_GENERATE_PKGCONFIG=ON -D BUILD_NEW_PYTHON_SUPPORT=ON .. ``` 这个CMake命令会配置OpenCV编译选项,并生成Makefile。 然后,在终端中输入以下命令进行编译: ``` make -j4 ``` 这个命令会使用4个线程并行地编译OpenCV。 最后,在终端中输入以下命令进行安装: ``` sudo make install ``` 这个命令会将编译好的OpenCV安装到系统目录中。 如果您想使用Python绑定,可以使用以下命令编译: ``` make -j4 opencv_python_module ``` 这个命令会编译Python绑定,并且会在build/lib/目录下生成一个opencv_python-<version>.so文件。您可以将这个文件复制到Python的site-packages目录中,就可以在Python中使用OpenCV了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

絮沫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值