簡體   English   中英

使用 OpenCV 和 Raspberry Pi 進行實時圖像處理

[英]Live image processing with OpenCV and Raspberry Pi

最近,我正在努力加速在我的 Raspberry Pi 3 平台上運行的 OpenCV 中的圖像處理。 我做過人臉識別應用,但效果很慢。 我閱讀了許多關於線程、多處理等的主題,但我仍然對此感到困惑。 我用人臉檢測來測試它只是為了讓它更簡單。 這是我的代碼:

pivideostream.py - 更新線程中的幀

from picamera.array import PiRGBArray
from picamera import PiCamera
from threading import Thread
import cv2

class PiVideoStream:

    def __init__(self, resolution=(640, 480), framerate=30):
        self.camera = PiCamera()
        self.camera.resolution = resolution
        self.camera.framerate = framerate
        self.rawCapture = PiRGBArray(self.camera, size=resolution)
        self.stream = self.camera.capture_continuous(self.rawCapture,format='bgr', use_video_port=True)
        self.image = None
        self.stopped = False

    def start(self):
        t = Thread(target=self.update)
        t.daemon = True
        t.start()
        return self

    def update(self):
        for frame in self.stream:
            self.image = frame.array
            self.rawCapture.truncate(0)

            if self.stopped:
                self.stream.close()
                self.rawCapture.close()
                self.camera.close()
                return  

    def read(self):
        return self.image

    def stop(self):
        self.stopped = True

process_img_thread.py - 主程序

from pivideostream import PiVideoStream
import cv2
from picamera.array import PiRGBArray
from picamera import PiCamera
import time


def detect_in_thread():
    # Start updating frames in threaded manner
    face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')
    thread_stream = PiVideoStream()
    thread_stream.start()
    time.sleep(2)

    # Read frames
    while True:

        # Original image
        image = thread_stream.read()

        # Full image - face detection
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray,1.3,5)
        for (x,y,w,h) in faces:
            detected_face = cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)

            # Region of interest - eyes detection 
            roi_color = image[y:y+h,x:x+w]
            roi_gray = gray[y:y+h,x:x+w]
            eyes = eye_cascade.detectMultiScale(roi_gray,1.03,5,0,(40,40))
            for (ex,ey,ew,eh) in eyes:
                cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,255),2)

        # Show computed image
        cv2.imshow('Threaded Camera OpenCV Preview',image)

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

    # Close image window and thread
    cv2.destroyAllWindows()
    thread_stream.stop()


if __name__ == "__main__":
    detect_in_thread()

當我顯示來自相機的原始幀時,它工作得很好,但是當我只在主程序中添加一些東西來處理圖像時,視頻速度約為 1 FPS :(。有人可以幫助我嗎?

米卡的建議非常好。

我在使用Python將OpenCV線程化時遇到問題(不確定是否可行),但是在對PiCamera幀抓取進行線程化方面做得很好。

我除了上述嘗試以下:

  1. 使用“ yuv”顏色空間而不是“ rgb”,只需訪問第一個(y-亮度)通道即可獲取灰度數據,從而減少了獲取幀並將RGB轉換為灰度的時間
  2. 嘗試使用LBP級聯而不是HAAR(例如/usr/local/share/OpenCV/lbpcascades/lbpcascade_frontalface.xml應該會更快一些,但准確性較低

以壓縮格式(例如jpeg )捕獲幀,它將加快捕獲過程,

前任:

camera.capture_continuous(stream, format='jpeg', ....)

....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM