我的程序

使用带有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()

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

===============>>#1 票数:0

如何使用时间模块?

这是一个伪代码:

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  

  ask by user2780101 translate from so

未解决问题?本站智能推荐: