2017-02-01 13 views
0

最近、私は自分のRaspberry Pi 3プラットフォームで動作するOpenCVで画像処理を高速化するのに苦労しています。私は顔認識アプリケーションをしましたが、非常にゆっくりと動作します。私はスレッディング、マルチプロセッシングなどについて多くのテーマを読んでいますが、それでも私はそれについて混乱しています。私はそれをより簡単にするために顔検出でテストしていました。ここに私のコードは次のとおりです。OpenCVとRaspberry Piによるライブ画像処理

pivideostream.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() 

- スレッド

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にフレームを更新します素晴らしいですが、画像を処理するためにメインプログラムに何かを追加すると、ビデオ速度は約1 FPSです:(。 誰かが私を助けることができますか?

+1

顔検出は、高価なタスクとラズベリーpiが遅いdeciceあるビット高速であるべきです。代わりにTK1 SoCを試してみてください。ただし、十分速くなる保証はありません。 – Micka

+1

画像内の顔のおおよその大きさを知っている場合は、画像のサイズを変更したり、検出サイズを制限することができます。 – Micka

答えて

0

ミカのアドバイスはとても良いです。

私はOpenCVをPythonでスレッドすることに問題がありましたが、それは可能ではありませんが、PiCameraフレームのスレッドにはうまくいきました。上記に

Iさらに次のことを試してください。

    代わりに「RGB」の
  1. 使用「YUV」色空間と単純には、最初に(Y - lumminance)にアクセスし、より少ない時間を無駄にし、階調データを取得するためのチャネルをフレームをフェッチし、
  2. 代わりにハールのLBPカスケードを使用してみてくださいグレースケールにRGBからの変換(/usr/local/share/OpenCV/lbpcascades/lbpcascade_frontalface.xmlはEG) - 、あまり正確
関連する問題