基于树莓派的文件扫描器的设计与实现
2021-09-23秦子实
秦子实
摘要:随着物联网设备的普及,物联网设备成本大幅下降,基于物联网设备的低成本硬件大量出现。在日常工作中,纸质文件扫描过程烦琐,需要配置扫描仪,而在对数据输入设备有限制的专用网络中,扫描仪接入及管理也是一件复杂的工作。因此,需要一种具有多种输入方式,且能够以常用方式输出的文件扫描设备。本文实现了一种基于树莓派的简易文件扫描器,具有成本低、低功率、体积小、使用限制少等特点,可以广泛应用于多种文件扫描场景。
关键词:树莓派;OpenCV;Python
中图分类号:TP393 文献标识码:A
文章编号:1009-3044(2021)21-0132-02
开放科学(资源服务)标识码(OSID):
1概述
在日常企业办公过程中,由于无纸化办公的推进,有大量纸质文件需要转换为数字档案进行存储,此类业务通常选用扫描仪来完成。扫描仪设备的使用场景较为单一,必须将大量文件资料逐页送入扫描仪,且通常使用USB输出在一台特定的计算机上。随着物联网技术的发展,卡片计算机及微型摄像头的成本大幅降低,同时图像处理技术也有了较大提升,而扫描仪本身即为一种将图像进行数字化处理的光学设备。因此,可以使用小型物联网设备对这一过程进行模拟并优化,使其符合更多的使用场景。
本文实现了一种基于树莓派和微型摄像头的文件扫描器,输入为文件的照片,可以通过USB、蓝牙、无线/有线网络等多种方式进行输出,使用场景灵活,且成本较扫描仪大幅降低。
2技术简介
2.1树莓派
树莓派是目前应用较为广泛的卡片计算机,最初设计用于基本的计算机科学教育。信用卡大小,流行版本峰值功率约10~15瓦,具备40针GPIO与外部硬件通信,同时具有15针MIPI接口(摄像头输入),CPU为ARMv7或v8系列四核1.2~1.5GHz,完全满足图像处理等复杂任务要求。操作系统通常使用基于Debian Linux的Raspbian,因此,Linux的大量软件可以通过本地编译在树莓派上继续使用。
2.2树莓派本地编译
在树莓派上使用OpenCV或新版Python需要通过源码编译,对于OpenCV,需要提前安装编译工具、开发工具、图片依赖、视频依赖、GUI依赖等库,此外,由于在树莓派这种计算资源受限的设备上,还应该安装矩阵计算优化库:
[# 编译/开发工具
sudo apt-get install build-essential cmakepkg-config
# 图片处理相关依赖
sudo apt-get install libjpeg-devlibtiff5-dev libjasper-devlibpng12-dev
# 视频处理相关依赖
sudo apt-get install libavcodec-devlibavformat-devlibswscale-devlibv4l-dev libxvidcore-devlibx264-dev
# GUI界面顯示相关依赖
sudo apt-get install libgtk2.0-dev libgtk-3-dev
# 矩阵运算优化库
sudo apt-get install libatlas-base-devgfortran ]
对于Python,需要提前安装头文件等资源:
[sudo apt-get install python2.7-dev python3-dev ]
另外,在编译前应临时调整系统虚拟内存大小并重启虚拟内存服务,使得编译过程能够利用树莓派的全部四颗核心,避免编译过程因为内存不足而挂起:
[sudo vim /etc/dphys-swapfile
CONF_SWAPSIZE=1024
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start ]
编译完成后应改回默认值,以避免SD卡因过度读写损坏。
3文件扫描器实现方案
3.1安装相关工具
在完成摄像头硬件安装后,应安装带有array模块的picamera库,以通过Python驱动摄像头并直接将图像转为numpy数组,以供下游的OpenCV处理:
[pip install "picamera[array]" ]
3.2获取图像
通过PiCamera获取摄像头图像,送入OpenCV并显示在Raspbian系统的GUI中:
[from picamera.array import PiRGBArray
from picamera import PiCamera
import time, cv2
# 初始化摄像头及数据引用
camera = PiCamera()
rawCampture = PiRGBArray(camera)
# 空一小段时间让摄像头硬件启动
time.sleep(0.1)
# 获取一张图片并显示
camera.capture(rawCapture, format="bgr")
img = rawCapture.array