[英]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.