首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有停止的情况下运行其余代码时每x秒打印一次?

如何在没有停止的情况下运行其余代码时每x秒打印一次?
EN

Stack Overflow用户
提问于 2021-12-31 17:10:21
回答 1查看 851关注 0票数 3

我已经看到了使用time.sleep()函数的方法,但是这阻止了其余代码的运行。

我正在做一个手识别脚本,并希望视频输出被某一特定值所阻碍,每秒钟打印一次。

这是我的密码:

代码语言:javascript
复制
import cv2
from cvzone.HandTrackingModule import HandDetector
import time

cap = cv2.VideoCapture(0)
detector = HandDetector(maxHands=1, detectionCon=0.7)
length = 0
while True:
    success, img = cap.read()
    hands, img = detector.findHands(img)

    if hands:
        hand1 = hands[0]
        lmlist1 = hand1["lmList"]
        bbox = hand1["bbox"]
        cp1 = hand1["center"]
        HandType = hand1["type"]
        #fingers1 = detector.fingersUp(hand1)
        #print(fingers1)
        length, info, img = detector.findDistance(lmlist1[8], lmlist1[5], img)
        
    
    print(length)
    time.sleep(1)
        
    
    cv2.imshow("Image", img)
    cv2.waitKey(1) 
    if cv2.waitKey(1) == ord("q"):
        break
    

cap.release()
cv2.destroyAllWindows()

问题在于:

代码语言:javascript
复制
print(length) 
time.sleep(1) 

视频的帧速率降低到1fps。

是否有一种方法可以运行打印命令,使其不影响帧速率?

谢谢。

编辑

这是新代码,而fps在我的电脑上仍然很低。

代码语言:javascript
复制
import cv2
from cvzone.HandTrackingModule import HandDetector
import time
import threading
import math
#Resolution: 720 x 1280

cap = cv2.VideoCapture(0)

detector = HandDetector(maxHands=1, detectionCon=0.7)
length = 0

fingerpos = [1,1,1,1,1]

    
def index(img):
    
    lil, info, img = detector.findDistance(lmlist1[8], lmlist1[5], img)
    
    lib, info, img = detector.findDistance(lmlist1[6], lmlist1[5], img)
    
    lit, info, img = detector.findDistance(lmlist1[8], lmlist1[6], img)
    
    
    index_angle = (lib**2 + lit**2 - lil**2) / (2 * lib * lit)
    
    index_angle = math.degrees(math.acos(index_angle))
    return int(index_angle)

def middle(img):
    lml, info, img = detector.findDistance(lmlist1[12], lmlist1[9], img)
    
    lmb, info, img = detector.findDistance(lmlist1[12], lmlist1[10], img)
    
    lmt, info, img = detector.findDistance(lmlist1[10], lmlist1[9], img)
    
    
    middle_angle = (lmb**2 + lmt**2 - lml**2) / (2 * lmb * lmt)

    middle_angle = math.degrees(math.acos(middle_angle))
    return int(middle_angle)

def ring(img):

    lrl, info, img = detector.findDistance(lmlist1[16], lmlist1[13], img)
    
    lrb, info, img = detector.findDistance(lmlist1[16], lmlist1[14], img)
    
    lrt, info, img = detector.findDistance(lmlist1[14], lmlist1[13], img)
    
    
    ring_angle = (lrb**2 + lrt**2 - lrl**2) / (2 * lrb * lrt)
    
    ring_angle = math.degrees(math.acos(ring_angle))
    return int(ring_angle)

def pinky(img):
    lpl, info, img = detector.findDistance(lmlist1[20], lmlist1[17], img)
    
    lpb, info, img = detector.findDistance(lmlist1[20], lmlist1[18], img)
    
    lpt, info, img = detector.findDistance(lmlist1[18], lmlist1[17], img)
    
    
    pinky_angle = (lpb**2 + lpt**2 - lpl**2) / (2 * lpb * lpt)
    
    pinky_angle = math.degrees(math.acos(pinky_angle))
    return int(pinky_angle)

def thumb(img):
    ltl, info, img = detector.findDistance(lmlist1[4], lmlist1[2], img)
    
    ltb, info, img = detector.findDistance(lmlist1[4], lmlist1[3], img)
    
    ltt, info, img = detector.findDistance(lmlist1[3], lmlist1[2], img)
    
    
    thumb_angle = (ltb**2 + ltt**2 - ltl**2) / (2 * ltb * ltt)
    
    thumb_angle = math.degrees(math.acos(thumb_angle))
    return int(thumb_angle)

def data(img):
        
    print(str(thumb(img)) + ", " + str(index(img)) + ", " + str(middle(img)) + ", " + str(ring(img)) + ", " + str(pinky(img)))
    time.sleep(0.5)                

threading.Thread(target=data).start()    

while True:
    success, img = cap.read()
    #img = cv2.resize(img, (640, 420)) 
    hands, img = detector.findHands(img)
    
    #print('Resolution: ' + str(img.shape[0]) + ' x ' + str(img.shape[1]))
    if hands:
        hand1 = hands[0]
        lmlist1 = hand1["lmList"]
        bbox = hand1["bbox"]
        cp1 = hand1["center"]
        HandType = hand1["type"]
        
        data(img)
        #print(str(thumb(img)) + ", " + str(index(img)) + ", " + str(middle(img)) + ", " + str(ring(img)) + ", " + str(pinky(img)))
            
    cv2.imshow("Image", img)
    cv2.waitKey(1) 
    if cv2.waitKey(1) == ord("q"):
        break
    

cap.release()
cv2.destroyAllWindows()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-31 17:16:15

一种方法是使用time.time来衡量已经过去了多少时间(每5秒左右打印一次“hi”,这不太精确,因为如果循环的某些部分花费更多时间,它可能会比预期的更晚打印):

代码语言:javascript
复制
import time


start = time.time()
while True:
    # run some code

    current_time = time.time()
    if current_time - start >= 5:
        print('hi')
        start = current_time

或者使用threading模块并发运行一个循环(每5秒打印一次'hi‘,这也是更精确的,因为时间测量不受“主”循环速度的影响(如上面的代码所示):

代码语言:javascript
复制
import time
import threading


def loop():
    while True:
        time.sleep(5)
        print('hi')


threading.Thread(target=loop).start()

while True:
    # run some code
    pass  # this can be removed after you add the actual code
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70544320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档