秦子實



摘要:隨著物聯網設備的普及,物聯網設備成本大幅下降,基于物聯網設備的低成本硬件大量出現。在日常工作中,紙質文件掃描過程煩瑣,需要配置掃描儀,而在對數據輸入設備有限制的專用網絡中,掃描儀接入及管理也是一件復雜的工作。因此,需要一種具有多種輸入方式,且能夠以常用方式輸出的文件掃描設備。本文實現了一種基于樹莓派的簡易文件掃描器,具有成本低、低功率、體積小、使用限制少等特點,可以廣泛應用于多種文件掃描場景。
關鍵詞:樹莓派;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