2012-10-12 89 views
7

Tôi đang thử nghiệm Raspberry Pi với mã hóa OpenCV và Python. Video streaming hoạt động rất tốt (tốc độ trung bình), nhưng khi tôi chạy dò tìm khuôn mặt trên luồng, CPU được chốt và làm mới hình ảnh chậm.Phát hiện khuôn mặt OpenCV chậm trên Raspberry Pi

Đây là những gì tôi có. Làm cách nào để tối ưu hóa mã của tôi?

#!/usr/bin/env python 
import sys 
import cv2.cv as cv 
from optparse import OptionParser 
min_size = (20, 20) 
image_scale = 2 
haar_scale = 1.2 
min_neighbors = 2 
haar_flags = 0 

def detect_and_draw(img, cascade): 
    # allocate temporary images 
    gray = cv.CreateImage((img.width,img.height), 8, 1) 
    small_img = cv.CreateImage((cv.Round(img.width/image_scale), 
           cv.Round (img.height/image_scale)), 8, 1) 
           cv.Round (img.height/image_scale)), 8, 1) 

    # convert color input image to grayscale 
    cv.CvtColor(img, gray, cv.CV_BGR2GRAY) 

    # scale input image for faster processing 
    cv.Resize(gray, small_img, cv.CV_INTER_LINEAR) 

    cv.EqualizeHist(small_img, small_img) 

    if(cascade): 
     t = cv.GetTickCount() 
     faces = cv.HaarDetectObjects(small_img, cascade, cv.CreateMemStorage(0), 
            haar_scale, min_neighbors, haar_flags, min_size) 
     t = cv.GetTickCount() - t 
     print "detection time = %gms" % (t/(cv.GetTickFrequency()*1000.)) 
     if faces: 
      for ((x, y, w, h), n) in faces: 
       # the input to cv.HaarDetectObjects was resized, so scale the 
       # bounding box of each face and convert it to two CvPoints 
       pt1 = (int(x * image_scale), int(y * image_scale)) 
       # bounding box of each face and convert it to two CvPoints 
       pt1 = (int(x * image_scale), int(y * image_scale)) 
       pt2 = (int((x + w) * image_scale), int((y + h) * image_scale)) 
       cv.Rectangle(img, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0) 

    cv.ShowImage("result", img) 

if __name__ == '__main__': 

    parser = OptionParser(usage = "usage: %prog [options] [camera_index]") 
    parser.add_option("-c", "--cascade", action="store", dest="cascade", type="str", help="Haar cascade file, default %default", default = "/usr/local/share/OpenCV/haarcascades") 
    (options, args) = parser.parse_args() 

    cascade = cv.Load(options.cascade) 
    capture = cv.CreateCameraCapture(0) 
    cv.NamedWindow("result", 1) 

    if capture: 
     frame_copy = None 
     while True: 
      frame = cv.QueryFrame(capture) 
      if not frame: 
       cv.WaitKey(0) 
       break 
      if not frame_copy: 
       frame_copy = cv.CreateImage((frame.width,frame.height), 
              cv.IPL_DEPTH_8U, frame.nChannels) 
      if frame.origin == cv.IPL_ORIGIN_TL: 
       cv.Copy(frame, frame_copy) 
      else: 
       cv.Copy(frame, frame_copy) 
      else: 
       cv.Flip(frame, frame_copy, 0) 

      detect_and_draw(frame_copy, cascade) 

      if cv.WaitKey(10) != -1: 
       break 
    else: 
     image = cv.LoadImage(input_name, 1) 
     detect_and_draw(image, cascade) 
     cv.WaitKey(0) 

    cv.DestroyWindow("result") 
+0

Dòng 'parser.add_option' của bạn bị cắt bớt, tôi nghĩ vậy. –

+0

Vâng, đúng thế. Nhưng đó không phải là vấn đề của tôi. – honeyshell

+2

Tôi chưa từng nói điều đó. :-) Chỉ cần cho bạn cơ hội để sửa điều đó; Tôi đã đóng chuỗi và dấu ngoặc đơn. –

Trả lời

5

Tôi có thể đề xuất bạn thác LBP thay vì Haar. Nó được biết đến là nhanh hơn đến 6 lần với tỷ lệ phát hiện rất gần.

Nhưng tôi không chắc liệu nó có thể truy cập được trong giao diện python cũ hay không. Lớp cv2.CascadeClassifier từ trình bao bọc mới có thể thực hiện dò tìm dòng thác LBP.

+0

Cảm ơn Andrew, tôi tìm thấy câu trả lời tương tự trên http://stackoverflow.com/questions/8791178/haar-cascades-vs-lbp-cascades-in-face-detection và một số mã kiểm tra trên http://docs.opencv.org /doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html. Nó mang lại hy vọng nhiều hơn cho dự án hexapode mâm xôi của tôi! – honeyshell

Các vấn đề liên quan