Jetson nano官方镜像自带的opencv版本是4.1系列的,为了更加舒适的使用opencv的dnn模块进行目标检测的应用我们需要把opencv的版本提高一些,这里我使用的是opencv4.5.1版本,并通过源代码进行安装。
安装前需要准备的步骤参照官方说明针对Jetson TX1的说明
opencv4.5.1-JetsonTX1
首先需要下载opencv的源码,可以选择下载扩展包衣方便未来的学习。
github下载
把源码下载好之后解压缩并且将文件目录结构保持相同
这里我们需要将原来的opencv卸载干净,使用指令
sudo apt-get purge libopencv*
sudo apt-get update
这里值得注意的是有很多的博客都用了sudo apt autoremove
这个指令,这个命令会把系统里一些卸载opencv之后的无关软件包一同卸载,这样大概率在后期的使用中会出现问题,所以不建议这样做。
原系统应该是已经安装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的版本存留在系统中很容易出现核心已转储的错误。
sudo pip3 uninstall numpy
pip3 list
#检查numpy是否已经被卸载
pip3 install numpy==1.18.4
在正式开始编译安装之前需要确保已经安装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
在执行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指令:注意以下指令建议先拷贝到一个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
以上就是全部内容,如果有帮助到你的话,点个赞吧!