簡體   English   中英

限制python和opencv上的視頻捕獲幀速率

[英]Limiting video capture frame rate on python and opencv

我正在嘗試從IP攝像機捕獲視頻並將其另存為AVI視頻文件。 同時,腳本會將包含面部的幀保存為jpeg文件。 當腳本執行這些工作時,CPU使用率約為100%。 因此,我只想在人臉檢測上限制幀速率。

我的代碼是:

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
now = datetime.datetime.now()
strtime = str(now)
cap = cv2.VideoCapture('rtsp://root:root@10.10.10.56: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)

我在許多不同的地方嘗試過cv2.VideoCapture.set(cv2.CAP_PROP_FPS,2),但是沒有用。 有什么方法可以限制視頻捕獲fps?

經過多次嘗試,我找到了適合自己需求的解決方案。 我計算了幀數,並使for循環每10幀進行一次人臉檢測。 當我將相機設置為流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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM