使用容器
推荐使用nvidia官方推荐的容器,如Deepstream之类的,nvidia官方的一些容器在下面的文章中有所介绍(包括官方的镜像仓库):
NVIDIA Jetson 系列文章(5):使用Docker容器的入门技巧
对于需要自己构建容器的,推荐以L4T-Base为镜像,非常不推荐除了官方镜像之外的一些容器镜像,因为nvidia为jetson制作镜像时加入了一些自己的组件,尤其是对于CSI摄像头有需求的。举个例子nvguscamera这个组件是对于使用CSI摄像头必用的组件(用于构建Gstreamer管道),但是该组件仅仅存在于nvidia官方镜像,其他的非官方镜像中没有。
接下来是在使用nvidia官方镜像进行修改中的一些踩坑点。
python安装
官方镜像系统和jetson nano宿主机系统一样,提供两个python版本,分别是python2.7和python3.6,但是现在的python版本都是比较高的,因此想要使用python较高版本的就需要自己安装,nano一般是不支持python3.9版本的apt安装,因此使用网上使用apt去安装的python3.9教程都无法成功。因此就需要使用源码安装。
不要对于系统预先安装的python做任何更改
因为jetson-nano的系统一些部分是基于预装的两个python构建的,更改后可能会使系统功能出现问题。
下载所需的python源码压缩包
1、添加所需的依赖项
这些都是python环境必须的一些包,必须先添加
sudo apt install -y build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev zlib1g build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev zlib1g
2、构建python源码
这一步十分重要,后续的许多问题都是这一步没做好引起的
mkdir /usr/local/python3.9.13 #作为编译后的python软件位置
cd path/python3.9.13 #下载并且解压缩好的源码主目录
./configure --prefix=/usr/local/python3.9.0
在编译的时候一定要注重输出,一般会看到如下的提示(构建完成的前面几行会输出提示):
The necessary bits to build these optional modules were not found:
_dbm _lzma _uuid
这就是一些python必须的模块系统中没有(一般是之前所需要下载的依赖没有下载好),只需要下载好对应的依赖再重新构建就行。
- 安装 libdb-dev(_dbm 模块的依赖项):
sudo apt-get install libdb-dev
- liblzma-dev(_lzma 模块的依赖项):
sudo apt-get install liblzma-dev
- 安装 uuid-dev(_uuid模块的依赖项):
sudo apt-get install uuid-dev
注意:有可能你系统里已经安装好了依赖但是构建的时候仍然显示缺少依赖项,这个时候一般是系统没有找到你的依赖项,这个时候就需要在构建的时候手动配置
./configure --with-libs='-luuid'
一直构建到没有说缺少任何的依赖项就行
3、编译与安装
make
make altinstall
这里最好使用altinstall,这样能最大程度的不影响原系统。altinstall与install的区别简单来说就是是否会覆盖原来的python二进制文件,具体有区别了解的可以百度。
到底为止python3.9就已经安装好了(对应的pip3.9也安装完毕)。如果要使用的话使用python3.9和pip3.9命令进行执行。
python3.9 --version # 查看对应版本
pip3.9 --version #查看对应版本
opencv-python安装
!!!!千万不要使用pip去安装opencv-python。
pip安装的opencv-python是其对应的二进制文件,我们是无法更改其配置的。而同样的,如果要使用CSI摄像头,opencv-python必须支持gstreamer库,否则哪怕你的系统里安装了gstreamer(nano自带),也无法使用,还会报错。
我们一般使用以下命令来查看opencv-python的配置
import cv2
print(cv2.getBuildInformation())
这会列出相应的opencv的配置
OpenCV modules:
To be built: calib3d core dnn features2d flann gapi highgui imgcodecs imgproc ml objdetect photo python2 python3 stitching ts video videoio
Disabled: world
Disabled by dependency: -
Unavailable: java js
Applications: tests perf_tests examples apps
Documentation: NO
Non-free algorithms: NO
GUI:
GTK+: YES (ver 2.24.32)
GThread : YES (ver 2.56.4)
GtkGlExt: NO
Media I/O:
ZLib: /usr/lib/aarch64-linux-gnu/libz.so (ver 1.2.11)
JPEG: /usr/lib/aarch64-linux-gnu/libjpeg.so (ver 80)
WEBP: build (ver encoder: 0x020e)
PNG: /usr/lib/aarch64-linux-gnu/libpng.so (ver 1.6.34)
TIFF: /usr/lib/aarch64-linux-gnu/libtiff.so (ver 42 / 4.0.9)
JPEG 2000: build (ver 1.900.1)
HDR: YES
SUNRASTER: YES
PXM: YES
PFM: YES
Video I/O:
FFMPEG: YES
avcodec: YES (57.107.100)
avformat: YES (57.83.100)
avutil: YES (55.78.100)
swscale: YES (4.8.100)
avresample: NO
GStreamer: YES (1.14.5)
v4l/v4l2: YES (linux/videodev2.h)
Parallel framework: TBB (ver 2017.0 interface 9107)
Trace: YES (with Intel ITT)
Other third-party libraries:
Lapack: NO
Eigen: YES (ver 3.3.4)
Custom HAL: YES (carotene (ver 0.0.1))
Protobuf: build (3.5.1)
Python 2:
Interpreter: /usr/bin/python2.7 (ver 2.7.15)
Libraries: /usr/lib/aarch64-linux-gnu/libpython2.7.so (ver 2.7.15+)
numpy: /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.13.3)
install path: lib/python2.7/dist-packages/cv2/python-2.7
Python 3:
Interpreter: /usr/bin/python3 (ver 3.6.9)
Libraries: /usr/lib/aarch64-linux-gnu/libpython3.6m.so (ver 3.6.9)
numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.13.3)
install path: lib/python3.6/dist-packages/cv2/python-3.6
Python (for build): /usr/bin/python2.7
Java:
ant: NO
JNI: NO
Java wrappers: NO
Java tests: NO
Install to: /usr
如果想要使用gstreamer, GStreamer这一行必须是yes。因此我们必须使用源码去编译配置opencv-python。
源码下载
具体的安装过程在其官方文档中有详细解释,这里就不写了。也是要注意一点的是,在执行cmake后也要关注其最后的输出,看看是否其配置符合你的要求,如果不符合,添加配置再重新cmake。其中编译的过程会非常缓慢,视情况而定。(本人亲测如果仅仅单核make的话可能要编译两个半小时)
注意:即使按照官方文档中的默认安装(不更改安装位置)也可能出现找不到cv2模块的情况,这种情况大概率是opencv系统环境变量没有配置。使用以下命令:
对当前终端生效
export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.9/site-packages
如果想永久生效的话,就将上面这个命令添加到~/.bashrc文件的末尾,并执行命令更新:
source ~/.bashrc