使用python在OpenCV中自动捕获视频中的图像

时间:2014-07-04 12:43:08

标签: python opencv python-3.x video-capture face-detection

我正在尝试开发一个用作自拍相机的代码。将在窗口中看到视频,并且将连续检测到人的面部和眼睛,并且一旦用户选择特定时间,就捕获该时间点的帧。我能够在一段时间后使用时间模块中的睡眠功能捕获帧,但视频帧似乎冻结。是否有任何解决方案,以便我可以继续看到视频,并在自动延迟一段时间后进行视频捕获。

我正在使用代码 -

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()

有人可以建议我吗?任何形式的帮助将不胜感激。

3 个答案:

答案 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