python opencv在网络摄像头视频中使用putText显示时间倒计时

samkhan13

目的:

我想在网络摄像头获得的每个帧上放置文本,以便可以分别显示文本“ 3”,“ 2”,“ 1”。因此描绘了一个倒数计时器。倒数之后,应将一帧写入文件,即保存到磁盘。只要视频流尚未关闭,这应该是可重复的。

每个帧都是在while循环内获得的,并且由于硬件配置,照相机可能具有未知的帧速率或更差的帧速率,在运行照相机的过程中,照相机每秒检索的帧数可能会有所不同。

time.sleep() 无法使用,因为它会冻结while循环并中断窗口中显示的视频流。

主while循环内的另一个while循环是不可接受的,因为它极大地减慢了处理器的速度,并且每秒处理的帧数更少,从而使视频流非常不连贯。

我尝试过的

import cv2
import sys
import time

# Initialize variables
camSource = -1
running = True
saveCount = 0
nSecond = 1
totalSec = 3.0
keyPressTime = 0.0
startTime = 0.0
timeElapsed = 0.0
startCounter = False
endCounter = False

# Start the camera
camObj = cv2.VideoCapture(camSource)
if not camObj.isOpened():
    sys.exit('Camera did not provide frame.')

frameWidth = int(camObj.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH))
frameHeight = int(camObj.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))

# Start video stream
while running:
    readOK, frame = camObj.read()

    # Display counter on screen before saving a frame
    if startCounter:
        if nSecond <= totalSec: 
            # draw the Nth second on each frame 
            # till one second passes  
            cv2.putText(img = frame, 
                        text = str(nSecond),
                        org = (int(frameWidth/2 - 20),int(frameHeight/2)), 
                        fontFace = cv2.FONT_HERSHEY_DUPLEX, 
                        fontScale = 3, 
                        color = (255,0,0),
                        thickness = 2, 
                        lineType = cv2.CV_AA)

            timeElapsed += (time.time() - startTime)
            print 'timeElapsed:{}'.format(timeElapsed)

            if timeElapsed >= 1:
                nSecond += 1
                print 'nthSec:{}'.format(nSecond)
                timeElapsed = 0
                startTime = time.time()

        else:
            # Save the frame
            cv2.imwrite('img' + str(saveCount) + '.jpg', frame)  
            print 'saveTime: {}'.format(time.time() - keyPressTime)

            saveCount += 1
            startCounter = False
            nSecond = 1

    # Get user input
    keyPressed = cv2.waitKey(3)
    if keyPressed == ord('s'):
        startCounter = True
        startTime = time.time()
        keyPressTime = time.time()
        print 'startTime: {}'.format(startTime)
        print 'keyPressTime: {}'.format(keyPressTime)

    elif keyPressed == ord('q'):
        # Quit the while loop
        running = False
        cv2.destroyAllWindows()

    # Show video stream in a window    
    cv2.imshow('video', frame)

camObj.release()

问题:

我可以看到我的方法几乎可以用,但是返回的CPU滴答数time.time()与实际秒数不同。每个数字的文本不会显示整整一秒钟,并且文件保存速度太快(1.5秒而不是3秒)。

我会接受作为答案:

如果您可以显示如何正确设置时间以及如何显示“ 3”,“ 2”,“ 1”,而不是我当前的显示“ 1”,“ 2”,“ 3”的方法

samkhan13

经过两天的苦苦挣扎并阅读了有关datetime模块的内容,我有所需的东西。但是,如果它是更pythonic的,我可以接受除我以外的其他答案。

import cv2
import sys
from datetime import datetime

# Initialize variables
camSource = -1
running = True
saveCount = 0
nSecond = 0
totalSec = 3
strSec = '321'
keyPressTime = 0.0
startTime = 0.0
timeElapsed = 0.0
startCounter = False
endCounter = False

# Start the camera
camObj = cv2.VideoCapture(camSource)
if not camObj.isOpened():
    sys.exit('Camera did not provide frame.')

frameWidth = int(camObj.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH))
frameHeight = int(camObj.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))

# Start video stream
while running:
    readOK, frame = camObj.read()

    # Display counter on screen before saving a frame
    if startCounter:
        if nSecond < totalSec: 
            # draw the Nth second on each frame 
            # till one second passes  
            cv2.putText(img = frame, 
                        text = strSec[nSecond],
                        org = (int(frameWidth/2 - 20),int(frameHeight/2)), 
                        fontFace = cv2.FONT_HERSHEY_DUPLEX, 
                        fontScale = 6, 
                        color = (255,255,255),
                        thickness = 5, 
                        lineType = cv2.CV_AA)

            timeElapsed = (datetime.now() - startTime).total_seconds()
#            print 'timeElapsed: {}'.format(timeElapsed)

            if timeElapsed >= 1:
                nSecond += 1
#                print 'nthSec:{}'.format(nSecond)
                timeElapsed = 0
                startTime = datetime.now()

        else:
            cv2.imwrite('img' + str(saveCount) + '.jpg', frame)  
#            print 'saveTime: {}'.format(datetime.now() - keyPressTime)

            saveCount += 1
            startCounter = False
            nSecond = 1

    # Get user input
    keyPressed = cv2.waitKey(3)
    if keyPressed == ord('s'):
        startCounter = True
        startTime = datetime.now()
        keyPressTime = datetime.now()
#        print 'startTime: {}'.format(startTime)
#        print 'keyPressTime: {}'.format(keyPressTime)

    elif keyPressed == ord('q'):
        # Quit the while loop
        running = False
        cv2.destroyAllWindows()

    # Show video stream in a window    
    cv2.imshow('video', frame)

camObj.release()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Docker中使用OpenCV(Python)访问网络摄像头?

使用Python和OpenCV错误校准网络摄像头

Python3处理并以网络摄像头fps显示网络摄像头流

使用OpenCV和Python显示网络摄像头

如何使用Python访问我的网络摄像头?

使用网络摄像头,OpenCV和Python跟踪眼瞳孔位置

如何在没有OpenCV的情况下使用python从网络摄像头捕获图像

如何使用带有Python编程的opencv缩放Logitech网络摄像头c930e?

在python openCV的网络摄像头视频上选择静态ROI

如何在Python中使用Android“ IP网络摄像头”应用程序

使用python静默捕获网络摄像头快照

OpenCV无法使用Python访问网络摄像头

Python,使用鼠标点击检测点在网络摄像头视频上绘制多边形

Python | 按时间间隔从网络摄像头捕获图像

如何在网络摄像头视频流上显示变量值?(python的OpenCV)

在Python 2.7中使用OpenCV 2.4.7.0在网络摄像头源上叠加图像

Python openCV-显示来自网络摄像头的图像时出错

无法在OpenCV中使用网络摄像头显示图像

启动网络摄像头并使用python捕获图像

在网络摄像头流上画线-Python

使用 Python openCV 从实时馈送(网络摄像头)中提取光流作为数据(数字)

使用 Python 捕获单个帧(使用网络摄像头)

Python,倒计时结束后使用网络摄像头捕获图像

OpenCV Python 在拍摄之前查看网络摄像头馈送?

Python cv2,将文本放在网络摄像头捕获上

从网络摄像头 OPENCV PYTHON 中去除背景

使用python从罗技网络摄像头录制音频和视频的好而简单的方法

OpenCV2 写入网络摄像头 python

在用于网络摄像头的 python 中使用 GStreamer 流式传输 Opencv 视频捕获帧