树莓派上玩MINST

听闻 TensorFlow 专门推出了官方适配树莓派的版本,就立马买了一个树莓派试一试,不过考虑到最新的树莓派3B+虽然是有GPU,但依旧很垃圾,所以选择了最简单的 MINST 上手。

(软硬件环境:树莓派3B+、树莓派官方 CSI 摄像头、python3.5、tensorflow、opencv3.4.4)

首先是这个小项目的目标:

  1. 通过树莓派自带的摄像头取图并自动预处理存储。
  2. 自动获取存储好的测试图片并快速识别。
  3. 将识别出的结果用语音的方式读出来。

其中第二个目标就是 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()

最后的效果应该是这样的:

树莓派上玩MINST
树莓派上玩MINST
在第一个界面时按 “c” 截取数字5,再按 “q” 即在根目录下截取到了大小为28*28,灰度二值化后的数字5图片。