我正在尝试开发一个用作自拍相机的代码。将在窗口中看到视频,并且将连续检测到人的面部和眼睛,并且一旦用户选择特定时间,就捕获该时间点的帧。我能够在一段时间后使用时间模块中的睡眠功能捕获帧,但视频帧似乎冻结。是否有任何解决方案,以便我可以继续看到视频,并在自动延迟一段时间后进行视频捕获。
我正在使用代码 -
import numpy as np
import cv2
import time
import cv2.cv as cv
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',frame)
#time.sleep(01)
Capture = cv.CaptureFromCAM(0)
time.sleep(5)
ret, frame = cap.read()
image = cv.QueryFrame(Capture) #here you have an IplImage
imgarray = np.asarray(image[:,:]) #this is the way I use to convert it to numpy array
cv2.imshow('capImage', imgarray)
cv2.waitKey(0)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
有人可以建议我吗?任何形式的帮助将不胜感激。
答案 0 :(得分:1)
为了连续观看视频,您需要重复显示视频的相同部分代码并将其置于while循环中。确保窗口的句柄不会丢失。您可以将捕获作为鼠标单击事件进行捕获并使用tickcount,一个在while循环开始之前,一个在循环内。一旦两个滴答计数之间的差异等于某些预定义的秒数,捕获该帧,使用break并退出while循环。
答案 1 :(得分:0)
您需要添加另一个' cap.read()'延迟结束时的行,因为这是实际捕获图像的代码。
答案 2 :(得分:0)
使用线程并与函数分开定义cv.imshow()
import threading
import cv2
def getFrame():
global frame
while True:
frame = video_capture.read()[1]
def face_analyse():
while True:
#do some of the opeartion you want
def realtime():
while True:
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
video_capture.release()
cv2.destroyAllWindows()
break
if __name__ == "__main__":
video_capture = cv2.VideoCapture(cam)
frame = video_capture.read()[1]
gfthread = threading.Thread(target=getFrame, args='')
gfthread.daemon = True
gfthread.start()
rtthread = threading.Thread(target=realtime, args='')
rtthread.daemon = True
rtthread.start()
fathread = threading.Thread(target=face_analyse, args='')
fathread.daemon = True
fathread.start()
while True: #keep main thread running while the other two threads are non-daemon
pass