2012-10-12 21 views
7

पर ओपनसीवी फेस डिटेक्शन धीमा है, मैं ओपनसीवी और पायथन कोडिंग के साथ रास्पबेरी पीआई का परीक्षण कर रहा हूं। वीडियो स्ट्रीमिंग बहुत बढ़िया (मध्यम गति) काम करती है, लेकिन जब मैं धारा पर चेहरे का पता लगाता हूं तो सीपीयू को चित्रित किया जाता है और छवि को ताज़ा करना धीमा होता है।रास्पबेरी पीआई

यहां मेरे पास है। मैं अपना कोड कैसे अनुकूलित कर सकता हूं?

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

मैं आपको हार के बजाय एलबीपी कैस्केड का सुझाव दे सकता हूं। यह बहुत करीब पहचान दर के साथ 6 गुना तेजी से जाना जाता है।

लेकिन मुझे यकीन नहीं है कि यह विरासत पायथन इंटरफ़ेस में पहुंच योग्य है या नहीं। नए रैपर से cv2.CascadeClassifier वर्ग एलबीपी कैस्केड के लिए पता लगा सकता है।

+0

धन्यवाद एंड्रयू, मुझे 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। यह मेरे रास्पबेरी हेक्सापोड परियोजना के लिए और अधिक आशा देता है! – honeyshell

संबंधित मुद्दे