python生成倒计时图片,在python / opencv中创建一个倒数计时器

My Program

Using open CV with python I am creating a virtual keyboard which uses a tracked object (which at the moment is a blue pen) and when said tracked object goes within the boundary of a rectangle a letter is printed (at this time I only have one rectangle which prints out "A" when the object intersects). This is all working fine however as you can imagine when the object goes within the boundary of the rectangle the letter is printed out multiple times very quickly.

My Problem

I need a way to ensure the user can enter the correct key correctly and the intended amount of said keys character is printed out. The way I intend to do this is by creating a timer that will only register the "key press" once the object has been inside the rectangle for say 3 seconds. I am having trouble however with actually creating the timer, it is probably something incredibly easy however I am having trouble actually coming up with a solution.

What I have tried so far

I have created a simple for loop which set a integer variable to a high value then once the object intersects with the rectangle the integer is reduced by one then once it equals 0 the letter is printed. code is as follows:

n = 600000

while n > 0:

n=n-1

print("A")

The problem with this is that the program pretty much comes to a standstill when it gets into the loop, this make the program incredibly jumpy and the visuals look horrible. I assume this is caused by the constant subtractions the code is performing thus this is not a good method for accomplishing my goal.

The other method I have tried is using time.sleep() and set it to say 3 seconds however as this pauses the program it again is unsuitable as visually the screen is frozen when the object enters the rectangle.

My Code

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

Any suggestions would be much appreciated

Thanks.

解决方案

How about using time module ?

Here is a pseudo code:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值