2012-10-12 3 views
7

OpenCV 및 Python 코딩으로 라즈베리 파이를 테스트하고 있습니다. 비디오 스트리밍은 훌륭하게 작동하지만 (중속), 스트림에서 얼굴 탐지를 실행하면 CPU가 고정되고 이미지 새로 고침이 느립니다.라즈베리 파이에서 OpenCV 얼굴 검출 속도가 느림

다음은 내가 가지고있는 것입니다. 내 코드를 어떻게 최적화 할 수 있습니까?

#!/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

'parser.add_option' 줄이 잘린 것 같습니다. –

+0

예, 그렇습니다. 하지만 그건 내 질문의 요점이 아니야. – honeyshell

+2

나는 결코 그런 말을하지 않았다. :-) 당신에게 그것을 바로 잡을 수있는 기회를주는 것; 문자열과 괄호를 닫았습니다. –

답변

5

나는 Haar 대신 LBP 캐스케이드를 제안 할 수 있습니다. 매우 근접한 탐지 속도로 최대 6 배 빠른 것으로 알려져 있습니다.

그러나 레거시 파이썬 인터페이스에서 액세스 할 수 있는지 확실하지 않습니다. 새 래퍼의 cv2.CascadeClassifier 클래스는 LBP 계단식 검색을 수행 할 수 있습니다.

+0

감사합니다. Andrew, http://stackoverflow.com/questions/8791178/haar-cascades-vs-lbp-cascades-in-face-detection 및 http://docs.opencv.org에서 일부 테스트 코드에 대한 동일한 답변을 찾을 수 있습니다. /doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html. 그것은 내 라스베가스 hexapode 프로젝트에 대한 더 많은 희망을 제공합니다! – honeyshell