9. 摄像头-手写数字识别(OpenCV)¶
在我们鲁班猫部分板卡上,支持摄像头这种常见的传感器的使用。
在不同板卡上,我们使用摄像头的方式稍有区别,这是不同板卡拓展能力差异造成的。
比如在 鲁班猫I.MX6ULL MINI
板卡上,只支持USB接口的摄像头,
而在 鲁班猫I.MX6ULL Pro
板卡上不仅支持USB摄像头,
还支持DVP接口的摄像头(如野火官方店铺有售的OV5460摄像头)。
重要
在做本节实验前,需要有摄像头硬件设备,请大家自行准备。
9.1. 手写数字识别实验¶
由于鲁班猫板卡支持摄像头器件,那么我们可以将摄像头连接到我们的鲁班猫板卡上, 并通过Python程序对摄像头进行使用。
对摄像头的使用,方式可以多种多样,那么在本节教程里, 我们就来完成一个通过摄像头进行手写数字识别的实验, 要完成这个实验,就会涉及到机器视觉相关的内容了,那么我们给大家简单介绍一下。
9.2. opencv-python库¶
9.2.1. opencv-python库简介¶
OpenCV是一个开源的跨平台计算机视觉和机器学习软件库。 它由一系列 C 函数和少量 C++ 类构成, 实现了图像处理和计算机视觉方面的很多通用算法。
opencv-python则是opencv库为Python语言提供的实现。这样一来,通过Python语言, 我们也能够利用到opencv库中丰富、强大的功能。
我们可以在鲁班猫板卡上安装opencv-python库, 并通过一些开源的代码来使用该库,完成手写数字识别实验。
9.3. 实验准备¶
9.3.1. 添加camera资源¶
重要
如使用USB摄像头则无需关注此小节内容,将摄像头插入USB接口即可。 若使用ov5640等DVP接口摄像头请仔细参考此小节内容。
在板卡上的部分资源可能默认未被开启,在使用前请根据需要修改 /boot/uEnv.txt 文件, 可添加对应设备树插件的加载,重启系统,以在系统中添加对应资源。
如本节实验中,通常情况下在鲁班猫系统中默认使能 camera
的功能,
如大家发现camera的设备树插件未加载,请做相应修改。
同时如果大家在使用中发现camera功能引脚被复用或有冲突,请要将对应占用camera引脚资源的设备树插件取消加载, 否则camera资源可能无法使用。若已开启对应资源,忽略以下步骤。
本节实验中,笔者使用鲁班猫i.MX6ULL Pro板卡为例演示, 板卡上camera的设备树插件和LED相关的设备树插件存在引脚冲突, 因此在启用camera设备树插件时,需要关闭LED相关的设备树插件。 找到camera、LED相关设备树插件修改,修改后并重启开发板。
方法参考如下:
添加camera设备树插件,以使系统支持camera功能,如下:
# 以鲁班猫i.MX6ULL Pro板卡camera设备树插件内容为例:
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-cam.dtbo
如若运行代码时出现“Device or resource busy”或者运行代码卡死等等现象, 请按上述情况检查并按上述步骤操作。
如出现 Permission denied
或类似字样,请注意用户权限,大部分操作硬件外设的功能,几乎都需要root用户权限,简单的解决方案是在执行语句前加入sudo或以root用户运行程序。
在启动文件中添加好设备资源并重启板卡之后,我们可以查看设备是否已经正常添加。
# 在终端中输入如下命令,可以查看到camera设备资源:
ls /dev/video*
检查板卡上的camera设备资源示例,仅供参考:
上图中显示了有两个视频设备,具体使用哪一个, 可以参考 《Linux Camera》 。
该章节中会介绍v4l-utils工具,可以查看到摄像头设备的相关信息。
9.3.3. 实验依赖工具及库安装¶
9.3.3.2. 库安装¶
1、安装opencv-python库前需要安装一些依赖库:
# 在终端中输入如下命令:
sudo apt -y install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools libatlas-base-dev libjasper-dev libqtgui4 libqt4-dev
重要
若为带QT的鲁班猫系统,无需安装gstreamer1.0-tools,请自行在命令中将其删除。
2、安装实验代码的依赖库:
# 在终端中输入如下命令:
sudo apt -y install python3-flask python3-pil python3-numpy python3-pip
3、拉取opencv-python库并安装:
# 拉取文件
wget https://cloud.embedfire.com/software/packages/opencv_python-3.4.6.27-cp37-cp37m-linux_armv7l.whl
# 安装opencv-python库
pip3 install opencv_python-3.4.6.27-cp37-cp37m-linux_armv7l.whl
等等安装完成后即可。
4、拉取实验代码:
# 在终端中输入如下命令:
git clone https://gitee.com/Embedfire/flask-video-streaming-recorder.git
完成后可以看到如下目录:
安装好对应的库并且将对应的实验代码拉取下来之后,我们就可以开始准备实验了。
9.3.4. 代码修改以适配¶
在运行代码前,我们需要关注一些注意事项:
9.3.4.1. 服务器监听IP及端口¶
代码服务器监听的IP及端口我们可以自行配置,大家根据实际情况修改,修改方法如下:
# 在终端中输入如下命令:
# 进入 flask-video-streaming-recorder 目录
cd ./flask-video-streaming-recorder/
# 修改 main.py 文件中的启动函数参数
nano main.py
# 将 app.run(threaded=True, host="0.0.0.0") 修改为
app.run(threaded=True, host="192.168.7.2",port=5000)
# 现在服务器监听的ip地址为192.168.7.2、端口为5000.
9.3.4.2. 适配摄像头设备号¶
根据使用的摄像头不同,要对代码进行部分修改:
1、先确定摄像头编号:
# 进入Python3终端:
python3
# 导入opencv库包
import cv2
# 输入如下命令:
cap = cv2.VideoCapture(0)
cap.isOpened()
# 如窗口中打印出了True,则此设备编号可用。
# 确定编号后,释放摄像头资源
cap.release()
若出现任何报错,请将摄像头编号依次递增尝试,找到可用的设备编号。
编号递增上限为video设备的数量,可使用 ls /dev/video*
命令查看。
video设备的数量获取,也可参考v4l-utils工具使用小节:《v4l-utils工具使用》 。
确定设备号步骤也可参考图:
2、修改实验代码,以适配自己的摄像头:
# 在终端中输入如下命令:
# 在 flask-video-streaming-recorder 目录下进入opencv操作摄像头的代码目录中:
cd ./controller/utils/
# 修改 camera.py 文件中的 VideoCamera(object)函数:
nano camera.py
# 将 self.cap = cv2.VideoCapture(0) 语句中的函数参数0修改为你摄像头对应的设备编号.
self.cap = cv2.VideoCapture(0)
9.4. 工程实验¶
9.4.1. 实验步骤¶
按照上一小节中的教程内容修改后,我们就可用运行实验代码来查看实验现象了。
# 在工程代码目录flask-video-streaming-recorder中,执行以下命令:
python3 main.py
可用查看到如下实验现象:
图中,程序打印的提示信息,告诉我们服务器以及开始监听 http://192.168.7.2:5000
的地址,
如若想退出程序,按下 CTRL+C
。
那么我们可以通过在浏览器中输入网址: http://192.168.7.2:5000 , 来观察一下实验现象。
实验现象如图:
登录完成后,进入到图像识别界面。
本Demo中使用的是opencv库中提供的K邻近算法对图像进行识别,训练参数等未仔细矫正过,识别率不高,仅供实验演示用。
对图像识别感兴趣的同学可以自行研究代码,添加数据集训练,或者更换其他模型进行实验。
具体的图像处理、数字识别功能在实验代码目录: controller/utils/opencvtest.py
中。
自此实验完成。
更多关于opencv库的使用,大家可自行在网上搜索相关资料学习。