2017-02-01 162 views
0

最近我在OpenCV的加速图像处理上我的树莓派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 :(。 有人能帮助我吗?

+1

脸部检测是一种昂贵的任务和覆盆子pi是一个缓慢的decice 。也许试试TK1 SoC,但不能保证足够快。 – Micka

+1

如果你知道面的近似大小在您的图像,你可以调整图像或限制检测尺寸。 – Micka

回答

0

Micka的意见都非常好。

我有问题,可以用Python线程OpenCV的(不知道这是可能的),但在穿线PiCamera抓帧做得很好。

我除了上述尝试以下操作:

  1. 使用“YUV”色彩空间,而不是“RGB”,并简单地访问第一(Y - lumminance)通道来获得灰度数据,浪费更少的时间取帧和从RGB转换为灰度
  2. 尝试使用LBP级联代替HAAR(例如/usr/local/share/OpenCV/lbpcascades/lbpcascade_frontalface.xml) - 应快一点,但较不准确