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相关设备树插件修改,修改后并重启开发板。

方法参考如下:

broken

添加camera设备树插件,以使系统支持camera功能,如下:

broken
# 以鲁班猫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设备资源示例,仅供参考:

broken

上图中显示了有两个视频设备,具体使用哪一个, 可以参考 《Linux Camera》

该章节中会介绍v4l-utils工具,可以查看到摄像头设备的相关信息。

9.3.2. 硬件连接

硬件连接小节,需要大家根据自身开发环境等情况对本章内容进行参考调整。

本章中笔者会使用DVP接口和USB接口的摄像头为大家进行演示。

笔者连接如下:

broken

9.3.3. 实验依赖工具及库安装

9.3.3.1. 工具安装

实验中我们会使用到一些工具,输入如下命令安装:

# 在终端中输入如下命令:
sudo apt -y install git wget

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

完成后可以看到如下目录:

broken

安装好对应的库并且将对应的实验代码拉取下来之后,我们就可以开始准备实验了。

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工具使用》

确定设备号步骤也可参考图:

broken

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)
broken

9.4. 工程实验

9.4.1. 实验步骤

按照上一小节中的教程内容修改后,我们就可用运行实验代码来查看实验现象了。

# 在工程代码目录flask-video-streaming-recorder中,执行以下命令:
python3 main.py

可用查看到如下实验现象:

broken

图中,程序打印的提示信息,告诉我们服务器以及开始监听 http://192.168.7.2:5000 的地址, 如若想退出程序,按下 CTRL+C

那么我们可以通过在浏览器中输入网址: http://192.168.7.2:5000 , 来观察一下实验现象。

实验现象如图:

broken

登录完成后,进入到图像识别界面。

broken

本Demo中使用的是opencv库中提供的K邻近算法对图像进行识别,训练参数等未仔细矫正过,识别率不高,仅供实验演示用。

对图像识别感兴趣的同学可以自行研究代码,添加数据集训练,或者更换其他模型进行实验。 具体的图像处理、数字识别功能在实验代码目录: controller/utils/opencvtest.py 中。

自此实验完成。

更多关于opencv库的使用,大家可自行在网上搜索相关资料学习。