[教學] Raspberry Pi Camera + Python + OpenCV投影片和範例程式 @虎科大

20170727_NFU_Camera_Python_OpenCV_2_Days_Workshop
七月底我們應虎科大電機工程系蔡老師的邀請,帶 Raspberry Pi + Python + Camera 兩天的工作坊。最後會實作”鄉民查水表”功能,是使用 Pi Camera 拍照後,用 OpenCV 做影像處理取得水表指針角度,就可以知道水表目前度數。學生很認真程度也很好,兩天的練習與實做都可以在時間內完成。我們未來也會和虎科大有更多的合作。

 

這次的工作坊共分為兩天,第一天是介紹 Raspberry Pi Camera + Python。內容與時間如下:
1. 相機原理與應用(1 小時)
2. 控制 Raspberry Pi Camera(2 小時)
- 使用指令列
- 使用 Python
3. 串接 imagga 網路服務(1 小時)
4. Camera和 Webcam(1 小時)
5. 影像串流(3 小時)
- 使用 RTSP + H.264
- 使用 HTTP + MJPG

投影片我們已經放在 slideshare 上了。範例程式在 github 上了。
Raspberry Pi Camera + Python + OpenCV (Day1) from raspberrypi-tw

 

第二天是介紹 Raspberry Pi Camera + OpenCV。內容與時間如下:
1. 色彩空間與基本影像處理(2 小時)
- 色彩空間介紹
- 用 Python + OpenCV 做影像處理
2. 常用影像處理方法(3 小時)
- 平滑,侵蝕與膨脹
- 找邊緣與找直線
- 找重心與找輪廓
3. 機器學習應用與綜合練習(3 小時)
- 人臉偵測
- 圖形分類(手寫辨識)

其中,在第二天工作坊中的圖形分類(手寫辨識),我們參考了 Ashing’s Blog內容,裡面有許多不錯的自學心得。

投影片在 slideshare 上。範例程式在 github 上了。
Raspberry Pi Camera + Python + OpenCV (Day2) from raspberrypi-tw

[測試] OpenCV on UP board

upboard

承蒙研揚科技公司好意,贈送一塊 UP board

有關開箱與安裝可參考以下幾篇文章:
* UP board:開箱與基本介紹
* [開箱] UP Board 開發板:可跑 Windows 10,世界最小 x86 PC
* [試用] 真的能跑 Windows 10 的開發板 – UP Board

由於 UP Board 所使用的 CPU 為 Intel Atom x5-Z8350,在 Intel 網站的規格為 64 位元 4 核心,時脈可達 1.92 GHz。乍看之下是比 Raspberry Pi 3 的處理速度快上不少,但 ARMX86 是不同架構,而且操作上的反應速度除了和時脈有關,不同的執行條件也會有差異。

我們使用 Python OpenCV 測試。只要輸入 sudo apt-get install python-opencv 就可以安裝有 Python binding 的 OpenCV

UVC(USB Video Class)就是 USB device class 視訊裝置在不需要安裝任何的驅動程式下隨插即用,包括網路攝影機(Webcam)、數位攝影機(Digital Camcorders)、類比影像轉換器(Transcoders)、電視卡(TV Receiver Card)等。而在 Linux 上如果有一個支援 UVC 的 Webcam 插到 USB,就會向 Kernel 註冊為 Webcam 設備,裝置節點為 /dev/videoX

V4L2(Video4Linux 2nd)是一套 Linux 針對視訊設備(例如 Webcam)所定義好的 Userspace API,因此硬體廠商只要能實做 API 的功能,就能讓使用者透過統一的介面控制硬體。如此一來上層的使用者就即使不知道硬體的廠牌與底層的實做方法,只要知道呼叫相同的函式就能得到相同的結果,如下圖。

v4l2圖片來源:Multimedia in embedded Linux systems

在 Raspberry Pi 上使用 Webcam 偵測人臉的程式(camera_face_detect.py)如下。需先下載 haarcascade_frontalface_default.xml 後和 camera_face_detect.py 一起執行,例如 python camera_face_detect.py haarcascade_frontalface_default.xml

#!/usr/bin/python                                  
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#|R|a|s|p|b|e|r|r|y|P|i|.|c|o|m|.|t|w|
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#
# camera_face_detect.py
# Face detect from camera
#
# Date   : 06/22/2014
# Usage  : python camera_face_detect.py haarcascade_frontalface_default.xml

import cv2
import sys
import time

cascPath = sys.argv[1]
faceCascade = cv2.CascadeClassifier(cascPath)

cap = cv2.VideoCapture(0)
cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,  640)
cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 480)

while True:
    # Capture frame-by-frame
    before = time.time()
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.cv.CV_HAAR_SCALE_IMAGE
    )

    after = time.time()
    print "Found {0} faces!, fps= {1}".format(len(faces), round(1/(after-before), 1))

    # Draw a rectangle around the faces
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # Display the resulting frame
    cv2.imshow("preview", frame)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

# When everything is done, release the capture
cap.release()
cv2.destroyAllWindows()

在沒有硬體加速的情況下,視訊從 Webcam 取得後就完全由 CPU 處理。程式中的 cv2.VideoCapture(0) 表示從 /dev/video0 取得 VideoCapture 物件,之後就可以透過 .set 或是 .read 等標準的 V4L2 API 存取 Webcam。

而人臉偵測在 OpenCV 中最常使用的方法為 Haar Feature-based Cascade Classifier,原理與使用可參考 Raspberry Pi Camera + Python 的介紹。

這次用的是 Microsoft LifeCam VX-800(圖右),動態攝影解析度為 30 萬像素(640×480 pixels)。產品規格書下載

raspberrypi_upboard_microsoft_1407

每個從 Webcam 取回的 frame 都會用 faceCascade.detectMultiScale 做人臉偵測的判斷,如果有找到則會用 cv2.rectangle 將人臉標示出來,並印出找到幾個人臉與 FPS(Frame per Second)。

face
圖片來源:Face Detection using Haar Cascades

架設的環境如下,左邊綠色的 pi-topCEED負責播影片,而 UP Board 接上 LifeCam VX-800 就執行人臉偵測,為了能即時顯示找到的人臉,就接上給奇創造On-Lap 1002 攜帶式螢幕。

raspberrypi_upboard_test_theme

測試的結果,在 640×480 的解析度下,使用 UP Board 做人臉辨識大概為 3-4 FPS。當然如果不將結果畫出來或是沒有啟動 X-Window 的情況下一定會有更好的結果。

upboard_opencv_v4l2

相同的測試條件在 Pi 3 大概只剩下 1 FPS。

raspberrypi_opencv_v4l2

由 UP Board 跑 OpenCV 的影片和在 Pi 3 跑 OpenCV 的影片,可看出在這個情境下 UP Board 的處理速度大概是 Pi 3 的四倍左右。

[活動] 2015/06/29 Raspberry Pi社群聚會 #08 會後資料

感謝大家的參與,這次上台展示的朋友好多。希望未來能每個月都能聚會,連結更多有興趣的朋友們,找到更多 Raspberry Pi 的可能。這次報名人數創新高,有 97 人報名。

meetup_09

分享者1:sosorry(台灣樹莓派)
Topic:Camera 應用展示,包括智慧型相機、人臉辨識+串流

sosorry_meetup_09

這次主要是應用展示,投影片內容來自於 PyCon 2015Tutorial,因此我們就附上之前課程投影片的連結吧。

Raspberry Pi Camera + Python from raspberrypi-tw

分享者2:張益裕
Topic:Android 監控

YiYu_Chang_and_MQTT_PiCommander
張老師這次修改了 PiCommander,以 MQTT 協定讓 Pi 和 Android 之間有訂閱(Subscribe)/發布(Publish)的功能,可以讓 GPIO 的事件更即時。
投影片下載

這次又有兩位朋友上台分享,做的東西都讓人眼睛一亮。

Kevin 展示自製視訊小車。有幾個特點,包括 Android 上的 WebRTC 視訊串流,和使用兩台 Segway 組合成的小車可確保重心平衡。
Kevin_and_Segway.jpg

Cody 使用多台 Pi 加上 Ceph 分散式儲存系統,可驗證該平台在 ARM 架構下的可行性,非常適合展示給客戶看。Cody 也會在 Raspberry Pi 社群聚會 #09 帶實機來展示與介紹。
Cody

歡迎大家來參加社群聚會,相關活動我們都會在網頁facebook 公告,如果有主題想分享也請來信 service AT raspberrypi.com.tw。

報名:Raspberry Pi社群聚會 #09