一、引言
上期借助官方提供的VisionFive.gpio包,实现了LED点阵屏内容的完善。这期来分享一下,使用VisionFive 2开发板连接通用的USB摄像机,抓拍二维码,并完成对二维码的内容进行解码。
二、搭建环境
使用PuTTY的ssh接口连接后开发板后,需要执行以下指令,以完成 StarFive Packages及其依赖的必要组件安装,下载安装时长比较久。
https:
chmod +x install_package_and_dependencies.sh
sudo ./install_package_and_dependencies.sh
前段时间烧录的系统是使用闪迪16GB的TF卡,在执行完脚本后,报安装vlc的libixml10与libupnp13组件下载安装失败,这可能跟网络状态、TF读写速度相关。
于是乎,笔者换了一张32GB的TF,重新烧写了202409版系统镜像,重新安装了vim、python3-pip、VisionFive.gpio包等。基于前期执行脚本的情况,在Linux中在线下载安装必备的组件包比较费时费劲,因此根据“install_package_and_dependencies.sh”脚本中的内容,将要下载的数据包,通过windows下的浏览器去下载,这样就高效多了。下载好的文件列表信息如下:

将windows中下载好的组件包文件,通过FileZilla的ssh接口,传输给VisionFive 2,保存到user目录下。然后在脚本中再对内容进行修改,以免执行指令时,按照脚本再去指定网址下下载。由于TF空间够大,为避免后续麻烦,因此将删除数据包的指令屏蔽掉。
DEBIAN_FRONTEND=noninteractive apt-get install libxslt1.1 openjdk-11-jdk -y
DEBIAN_FRONTEND=noninteractive apt-get install libmd4c-dev libdouble-conversion-dev libc6-dev libpcre2-16-0 "^libxcb.*" libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-x11-dev -y
DEBIAN_FRONTEND=noninteractive apt-get install libevent-dev libdbus-glib-1-dev -y
DEBIAN_FRONTEND=noninteractive apt-get install libopenal-dev libcdio-paranoia-dev libdc1394-dev libcaca-dev libv4l-dev libpocketsphinx-dev libbs2b-dev liblilv-0-0 librubberband-dev libmysofa-dev libflite1 libass-dev libvidstab-dev libzmq3-dev libzimg-dev libgme-dev libopenmpt-dev libchromaprint-dev librabbitmq-dev libssh-dev libsrt-openssl-dev liba52-0.7.4-dev libhwy1 libjxl0.7 -y
DEBIAN_FRONTEND=noninteractive apt-get install libv4l-0 libv4l-dev v4l-utils libjpeg-dev libdrm-dev -y
DEBIAN_FRONTEND=noninteractive apt-get install libre2-9 libminizip-dev -y
DEBIAN_FRONTEND=noninteractive apt-get install fonts-mathjax libjs-mathjax libpython3.11-minimal libpython3.11-stdlib python3-numpy python3.11 python3.11-minimal python3-h5py libvtk9.1 libqt5test5 libqt5opengl5 libtesseract5 libgdcm-dev libgdal-dev -y
DEBIAN_FRONTEND=noninteractive apt-get install gstreamer1.0-clutter-3.0 -y
DEBIAN_FRONTEND=noninteractive apt-get install fonts-freefont-ttf libaribb24-0 libcddb2 libdvbpsi10 libebml5 libixml10 liblirc-client0 liblua5.2-0 libmad0 libmatroska7 libprotobuf-lite32 libqt5x11extras5 libresid-builder0c2a libsdl-image1.2 libsdl1.2debian libsidplay2 libspatialaudio0 libupnp13 libva-wayland2 libvncclient1 -y
dpkg -i nodejs-18.0.0_riscv64.deb
dpkg -i v8-10.2.154.13_riscv64.deb
dpkg -i libreoffice_7.5_riscv64.deb
dpkg -i qt-5.15-2-wayland_riscv64.deb
dpkg -i firefox_105.0_202305_riscv64.deb
dpkg -i nwjs_0.65.1-2_riscv64.deb
dpkg -i v4l2test_riscv64.deb
dpkg -i chromium-103.0.5060.114.deb
tar -xvzf multimedia.tar.gz
cd $PWD/multimedia
dpkg --force-all -i *.deb
cd ..
tar -xvzf opencv-deb.tar.gz
cd $PWD/opencv-deb
dpkg --force-all -i *.deb
cd ..
tar -xvzf gst-cogl.tar.gz
cd $PWD/gst-cogl
dpkg --force-all -i *.deb
cd ..
tar -xvzf vlc-packages.tar.gz
cd $PWD/vlc-packages
dpkg --force-all -i *.deb
cd ..
echo "Install Success"
这样处理后,再执行脚本就高效了,在线安装必备的依赖库文件后,直接本地解压并安装组件包。


三、USB摄像头
本次实验采用的是一个分辨率为2592*1944的uvc免驱工业摄像机。无自动聚焦功能,由于之前贴了滤光片,因此手动对焦,以及周围环境给光显得尤为重要。摄像头配无畸变镜头,实物如下:

摄像头需要在windows下使用“AMCap”工具,手机支架固定好位置,调好焦距,使采集的图片清晰明朗。

四、安装USB软件包
由于此次使用的USB摄像头,并没用到IMX219 CSI摄像头,因此需要安装关于USB的软件包。
sudo apt-get install usbutils
在user目录下执行上述指令,然后通过lsusb指令,可查询到接入USB接口的摄像头。

使用“v4l2-ctl --list-device”可查询当前挂载video设备

使用“v4l2-ctl --device=/dev/video4 --all”可查看挂载在video4的USB摄像头配置信息

五、执行实验代码
cd /usr/share/doc/opencv-doc/examples/python/
python3 qrcode.py --device=4
通过执行上述两步指令后,可启动二维码检测程序。然而执行后提示如下:

针对上述问题,需要安装好opencv的python依赖软件包
sudo apt-get install libopencv-dev python3-opencv
成功安装完成后,在ssh终端再次执行“python3 qrcode.py --device=4”指令,提示如下:

出现上述情况,需通过HDMI的桌面方式登录后,在系统终端中,进入到“/usr/share/doc/opencv-doc/examples/python/”路径下,再执行“qrcode.py”脚本程序。
摄像头聚焦良好,可以顺利检测到二维码并解析成功。

终端打印如下:

六、后记
正如上述,可以成功检测二维码并解析成功,但是次日,想录制视频发帖时,结果发现桌面方式无法登录了,不管是user身份还是root身份,密码也没改,怎么回事?使用Uart或者ssh方式,都可以正常连接登录。彻底懵了,因为搭建这个环境联网比较费时。


“Not listed?”也不知道是啥原因,联系赛昉FAE远程协助,也没查出bug所在,想通过拷贝TF镜像来分析问题,但是插入TF卡弹出三个盘,且三个盘都强制要求格式化才能访问,这样的话也没法通过Ubuntu虚拟机来挂载TF,使用dd命令将镜像压缩出来了。无奈只能重刷系统,重新构建环境了。
经过再次联网下载必备软件包后,运行指令后,桌面终端提示:

这说明摄像头检测到二维码并解析出结果了,但是由于不是以user身份运行指令,所以无法打开firefox浏览器,“python3 qrcode.py --device=4”命令需要以user身份运行,不用加sudo执行,这样就能顺利启动firefox,视频见底部。
后面正常关机后,再次通过HDMI桌面的方式登录系统,可以正常登录,没有复现到之前的情况。
初步结论:
①、可能是由于多重身份运行后,导致文件丢失。当时使用ssh以root身份执行shutdown关机指令,而在桌面的终端以user身份运行着二维码检测程序。
②、摄像头挂载的device设备号不固定,非法访问到其它系统媒体设备号了,导致gdm3驱动异常。
好了,此次实验分享到此结束,以上经历仅供参考,遇到类似问题的坛友,欢迎留言共同讨论。