2012-10-12 171 views
7

Estoy probando Raspberry Pi con codificación OpenCV y Python. La transmisión de video funciona muy bien (velocidad media), pero cuando ejecuto la detección de rostros en la transmisión, la CPU se fija y la imagen se vuelve lenta.La detección de la cara de OpenCV es lenta en Raspberry Pi

Esto es lo que tengo. ¿Cómo puedo optimizar mi código?

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

Su línea 'parser.add_option' está truncada, creo. –

+0

Sí, lo es. Pero ese no es el punto de mi pregunta. – honeyshell

+2

Nunca dije que fuera. :-) Solo te da la oportunidad de corregir eso; Cerré la cadena y el paréntesis. –

Respuesta

5

Puedo sugerirle la cascada de LBP en lugar de Haar. Se sabe que es hasta 6 veces más rápido con una tasa de detección muy cercana.

Pero no estoy seguro de si está accesible en la interfaz heredada de python. La clase cv2.CascadeClassifier de los nuevos contenedores puede hacer la detección de la cascada de LBP.

+0

Gracias Andrew, encuentro la misma respuesta en http://stackoverflow.com/questions/8791178/haar-cascades-vs-lbp-cascades-in-face-detection y algunos códigos de prueba en http://docs.opencv.org /doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html. ¡Da más esperanza para mi proyecto hexapode de frambuesa! – honeyshell

Cuestiones relacionadas