在python/opencv中创建倒计时计时器



我的程序

使用python的开放式CV,我正在创建一个虚拟键盘,该键盘使用一个被跟踪的对象(目前是一支蓝色笔),当所述被跟踪对象进入矩形的边界时,会打印一个字母(此时我只有一个矩形,当对象相交时会打印出"a")。这一切都很好,但正如你所能想象的,当对象进入矩形的边界时,字母会很快打印多次。

我的问题

我需要一种方法来确保用户可以正确输入正确的密钥,并打印出所述密钥字符的预期数量。我打算这样做的方法是创建一个计时器,只有当对象在矩形内停留3秒时,它才会记录"按键"。然而,我在实际创建计时器时遇到了麻烦,这可能是一件非常容易的事情,但我在实际想出解决方案时遇到了困难。

到目前为止我尝试了什么

我创建了一个简单的for循环,它将一个整数变量设置为一个高值,然后一旦对象与矩形相交,整数就会减少一,然后一旦它等于0,就会打印字母。代码如下:

n = 600000
while n > 0:
n=n-1
print("A")

这样做的问题是,当程序进入循环时,它几乎会陷入停顿,这使得程序变得异常紧张,视觉效果看起来很糟糕。我认为这是由代码执行的不断减法引起的,因此这不是实现我目标的好方法。

我尝试过的另一种方法是使用time.sleep()并将其设置为3秒,但由于这会暂停程序,因此它再次不合适,因为当对象进入矩形时,屏幕在视觉上被冻结了。

我的代码

import cv2
import numpy as np
import time
import os
cap = cv2.VideoCapture(0)
pressed = 0

while(1):
# read the frames
_,frame = cap.read()
# smooth it
frame = cv2.blur(frame,(3,3))
# convert to hsv and find range of colors
hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
thresh = cv2.inRange(hsv,np.array((75, 96, 205)), np.array((144, 233, 255)))
thresh2 = thresh.copy()
# find contours in the threshold image
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
# finding contour with maximum area and store it as best_cnt
max_area = 0
for cnt in contours:
    area = cv2.contourArea(cnt)
    if area > max_area:
        max_area = area
        best_cnt = cnt
# finding centroids of best_cnt and draw a circle there
M = cv2.moments(best_cnt)
cx,cy = int(M['m10']/M['m00']), int(M['m01']/M['m00'])
cv2.circle(frame,(cx,cy),5,255,-1)
if cx < 100 and cy < 100:
    cv2.rectangle(frame,(10,0),(100,100),(255,0,0),3)
    pressed = 1
    if pressed == 1:
        n = 9000000
        while n > 0:
            n=n-1
        print("A")
        pressed = 0

else:
    cv2.rectangle(frame,(10,0),(100,100),(0,255,0),3)
    pressed = 0
# Show it, if key pressed is 'Esc', exit the loop
cv2.imshow('frame',frame)
cv2.imshow('thresh',thresh2)
if cv2.waitKey(33)== 27:
    break

# Clean up everything before leaving
cv2.destroyAllWindows()
cap.release()

任何建议都将不胜感激谢谢

此代码主要用于设置OpenCV中的计时器。

  • 这里我使用的是日期时间库。持续时间为5秒如果您想要不同的持续时间,您可以根据自己的选择更改duration = 5
  • 我使用两个while循环,外部用于大型机,内部用于持续时间
  • 定时器的概念是简单的diff = (datetime.now() - start_time).seconds。我们只需要从当前时间中减去开始时间,并在.seconds的帮助下将毫秒转换为秒
  • 在第二个while循环while( diff <= duration ):中,如果diff低于持续时间,则它将使用此函数cv2.putText()打印帧上剩余的时间

注:

  • r重置时间,按q退出

代码从这里开始

import cv2
from datetime import datetime
# the duration (in seconds)
duration = 5
cap = cv2.VideoCapture(0+cv2.CAP_DSHOW)
qu = 0
while True:
    
    ret, frame = cap.read()
    start_time = datetime.now()
    diff = (datetime.now() - start_time).seconds # converting into seconds
    while( diff <= duration ):
        ret, frame = cap.read()
        cv2.putText(frame, str(diff), (70,70), cv2.FONT_HERSHEY_SIMPLEX , 1, (255, 0, 0), 2, cv2.LINE_AA)# adding timer text
        cv2.imshow('frame',frame)
        diff = (datetime.now() - start_time).seconds
        k = cv2.waitKey(10)
        if k & 0xFF == ord("r"): # reset the timer
            break
        if k & 0xFF == ord("q"): # quit all
            qu = 1
            break
        
    if qu == 1:
        break
cap.release()
cv2.destroyAllWindows()

使用时间模块怎么样?

这里有一个伪代码:

import time
time_count = 0                  # init
#processing routine start 
start_time = time.time()
processing
#processing ends
end_time = time.time()  
if(object_in_square):
    time_count + = end_time - start_time
    if(time_count > time_defined_by_you (ie 3 sec or whatever you choose to keep):
        # press confirm
        # take action   
else:
    time_count = 0  

相关内容

  • 没有找到相关文章

最新更新