2015-12-30 138 views
0

我試圖從ip攝像頭捕獲視頻並保存爲avi視頻文件。同時腳本將包含面部的幀保存爲jpeg文件。雖然腳本正在做這些工作,但CPU使用率大約是100%。正因爲如此,我想限制幀速率只在人臉檢測。在python和opencv上限制視頻捕獲幀率

我的代碼是:

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 
now = datetime.datetime.now() 
strtime = str(now) 
cap = cv2.VideoCapture('rtsp://root:[email protected]:554/stream/profile1=r') 




fourcc = cv2.VideoWriter_fourcc(*'XVID') 
out = cv2.VideoWriter('1/video/%s.avi' % strtime,fourcc, 10.0 , (960,540)) 

if cap.isOpened(): 


    while(True): 
     if cap.set(cv2.CAP_PROP_FPS,4): 

      try: 


       ret, frame = cap.read() 

       if ret==True: 


        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
        out.write(frame) 

        if cv2.waitKey(1) & 0xFF == ord('q'): 
         break 
        faces = face_cascade.detectMultiScale(gray, 
                  scaleFactor=1.5, 
                  minNeighbors=6, 
                  minSize=(30,30)) 
        for (x,y,w,h) in faces: 
         cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0), 
         cv2.imwrite('1/frames/%sf%s.jpg'%(now,str(cap.get(cv2.CAP_PROP_POS_FRAMES))), frame) 


        cv2.imshow('frame', frame) 


      except KeyboardInterrupt: 
       cap.release() 
       out.release() 
       cv2.destroyAllWindows() 
       sys.exit(0) 
       pass 

else: 
    print "Unable to connect" 


cap.release() 
out.release() 
cv2.destroyAllWindows() 
sys.exit(0) 

我已經在許多不同的地方(2 cv2.CAP_PROP_FPS)試圖cv2.VideoCapture.set,但沒有奏效。有什麼辦法可以限制視頻捕捉fps嗎?

回答

2

經過多次嘗試,我找到了適合我需求的解決方案。我計算幀數併爲每10幀的臉部檢測工作做了for循環。當我將相機設置爲流10 fps視頻時,這應該表示人臉檢測流爲1 fps。

的編碼解決方案:

if int(cap.get(cv2.CAP_PROP_POS_FRAMES)) % 10 == 0: 
    faces = face_cascade.detectMultiScale(gray, 
              scaleFactor=1.5, 
              minNeighbors=5, 
              minSize=(30, 30)) 
    for (x, y, w, h) in faces: 
     cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0)) 
     cv2.imwrite('1/frames/%sf%s.jpg'%(now, str(cap.get(cv2.CAP_PROP_POS_FRAMES))), frame)