树莓派上玩MINST
听闻 TensorFlow 专门推出了官方适配树莓派的版本,就立马买了一个树莓派试一试,不过考虑到最新的树莓派3B+虽然是有GPU,但依旧很垃圾,所以选择了最简单的 MINST 上手。
(软硬件环境:树莓派3B+、树莓派官方 CSI 摄像头、python3.5、tensorflow、opencv3.4.4)
首先是这个小项目的目标:
- 通过树莓派自带的摄像头取图并自动预处理存储。
- 自动获取存储好的测试图片并快速识别。
- 将识别出的结果用语音的方式读出来。
其中第二个目标就是 TensorFlow 原有的入门小项目,而第一和第三个目标则是在第二个目标基础上做出了一定的拓展。
第一个目标
前期准备
既然是取图,当然牵涉到视频图像处理,那么自然要用到 opencv ,不过需要注意的是树莓派自带的摄像头是 CSI 接口的,并不是通过 USB 接口传输数据,需要我们先打开树莓派的相关配置:
sudo raspi-config
选择 Interfacing Option ,再选择 Camera 按下回车,确定使用 Pi Camera 后重启即可。
接下来我们需要安装两个调用树莓派摄像头必不可少的模块:
pip3 install picamera
pip3 install opencv-python
网上各种说需要源码编译 opencv ,但是笔者觉得个人开发而言,直接 pip 一般够了。
代码分析及效果展示
下面是这部分的代码:
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
import os
import sys
def Cap():
# 自适应系统获取根目录
path = os.path.abspath(os.path.dirname(sys.argv[0]))
# 视频参数设置
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
# 给摄像头的开启缓冲时间
time.sleep(0.1)
# 获取视频帧数据
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
# 截取帧数据存储路径
img_path = path +'/num.jpg'
# 以数组形式存储帧数据
image = frame.array
# 在视频相应区域画出图片截取框
cv2.rectangle(image,(int(200),int(100)),(int(284),int(184)),(255,255,255),4)
# 显示帧数据
cv2.imshow("Capture img", image)
key = cv2.waitKey(1) & 0xFF
# 截取框内图片数据
Cap = image[100:184,200:284]
# 对截取图片进行改大小、灰度二值化预处理
Cap = cv2.resize(Cap,(28,28))
Cap = cv2.cvtColor(Cap,cv2.COLOR_BGR2GRAY)
ret,Cap = cv2.threshold(Cap,127,255,cv2.THRESH_BINARY)
# 清除数据流准备下一帧
rawCapture.truncate(0)
# 按下"c"存储图片并覆盖上一次图片
if key == ord("c"):
if os.path.isfile("num.jpg"):
os.remove("num.jpg")
cv2.imwrite(img_path,Cap)
else:
cv2.imwrite(img_path,Cap)
# 按下"q"退出
if key == ord("q"):
break
if __name__ == '__main__':
Cap()
最后的效果应该是这样的:
在第一个界面时按 “c” 截取数字5,再按 “q” 即在根目录下截取到了大小为28*28,灰度二值化后的数字5图片。