簡體   English   中英

如何在每5秒鍾的相機中使用opencv python和Raspbery Pi 3捕獲圖片?

[英]How to capture a picture after every 5 seconds of camera using opencv python and Raspbery Pi 3?

我正在做一個學校項目,該項目與使用OpenCV Python和Raspberry Pi 3進行圖像處理有關。

Raspberry Pi 3的硬件無法連續處理來自攝像機的視頻,因此我正在考慮僅每隔5秒鍾從攝像機中捕獲一張圖片,並使用它來識別我的需求,然后繼續。

我在互聯網上進行了一些研究,發現了一個名為time.sleep(5)的函數,但是該函數僅將相機暫停5秒鍾,然后繼續。

誰能幫助我解決我的問題。 非常感謝。 對不起,我的英語不好,這是到目前為止的代碼。 在我的代碼中,我首先使用視頻進行測試,然后找出解決方案后,將其應用在相機上。

import cv2
import numpy as np
import time

headcc = cv2.CascadeClassifier('lib/heads_cascade.xml')
cap = cv2.VideoCapture('image/hockey_game.avi')

def video():
    ret, frame = cap.read()

    # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    head = headcc.detectMultiScale(frame, 1.2, 2, 0 , (20, 20), (40, 40))

    print type(head)
    print head
    print head.shape
    print "Number of heads detected: " + str(head.shape[0])


    if len(head) > 0:
        for (x, y, w, h) in head:
            cv2.rectangle(frame, (x,y), (x+w, y+h), (0, 255, 255), 1)

    cv2.rectangle(frame, ((0,frame.shape[0] -25)),(270, frame.shape[0]), (255,255,255), -1)
    cv2.putText(frame, "Number of head detected: " + str(head.shape[0]), (0,frame.shape[0] -10), cv2.FONT_HERSHEY_TRIPLEX, 0.5,  (0,0,0), 1)

    cv2.namedWindow('Camera',cv2.WINDOW_NORMAL)
    cv2.imshow('Camera',frame)


while(cap.isOpened()):
    video()
    time.sleep(5)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

更新2018年3月15日 :感謝Joe的評論,我找到了跳過幀的方法。 但是,程序仍然無法確定視頻是否結束,並且fps代碼仍顯示為0.0。 因此,如果對這些錯誤有任何幫助,我將不勝感激。 這是到目前為止的代碼:

import cv2
import numpy as np
import time

headcc = cv2.CascadeClassifier('lib/heads_cascade.xml')
cap = cv2.VideoCapture('image/hockey_game.avi')
fps = cap.get(cv2.CAP_PROP_POS_FRAMES)

def video():
    ret, frame = cap.read()

    # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    head = headcc.detectMultiScale(frame, 1.2, 2, 0 , (20, 20), (40, 40))

    # print type(head)
    # print head
    # print head.shape
    print "Number of heads detected: " + str(head.shape[0])

    if len(head) > 0:
        for (x, y, w, h) in head:
            cv2.rectangle(frame, (x,y), (x+w, y+h), (0, 255, 255), 1)

    # cv2.rectangle(frame, ((0,frame.shape[0] -25)),(270, frame.shape[0]), (255,255,255), -1)
    # cv2.putText(frame, "Number of head detected: " + str(head.shape[0]), (0,frame.shape[0] -10), cv2.FONT_HERSHEY_TRIPLEX, 0.5,  (0,0,0), 1)

    cv2.namedWindow('Camera',cv2.WINDOW_NORMAL)
    cv2.imshow('Camera',frame)


while(cap.isOpened()):
    video()
    cf = cap.get(cv2.CAP_PROP_POS_FRAMES) - 1
    cap.set(cv2.CAP_PROP_POS_FRAMES, cf+50)
    # cv2.setTrackbarPos("pos_trackbar", "Frame Grabber", 
int(cap.get(cv2.CAP_PROP_FPS)))
    time.sleep(2)
    if (cv2.waitKey(1) & 0xFF == ord('q')):
        break

print fps
cap.release()
cv2.destroyAllWindows()

文檔說明

VideoCapture::read
Grabs, decodes and returns the next video frame.

您的視頻每秒可能有25幀,並且正在逐一閱讀。

如果這是您所期望的,則視頻不在后台播放。 您的video()函數只是一幀一幀地遍歷它。

解決方案是真正從設備中搶購( read功能也可以獲取設備ID,請參閱doc)。

device – id of the opened video capturing device (i.e. a camera index).

就像是

# something like
cap = cv2.VideoCapture('/dev/video0') 

另一種方法是使用以下方法跳過幀

VideoCapture::grab

描述在這里

這樣,您可以快速繞過想要的許多幀。

grab()似乎相當快,因為​​它不解碼幀。 因此,您可以找出您的視頻每秒幾幀。 然后調用.read()並且調用后.grab()經常為你的視頻在5秒鍾內幀。 然后再次調用.read()

或者真正將圖片保存到磁盤上並進行處理。

暫無
暫無

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

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