大家好,我是一名編程新手,我想在實時攝像機檢測到微笑時捕捉影像并播放歌曲。我已經創建了一個單獨的執行緒來播放完整的歌曲,并使用多執行緒保存影像,因為在播放歌曲時,幀會被卡住。 我所面臨的問題是,在無限的while回圈中,多執行緒函式在一秒鐘內被多次呼叫,導致歌曲和許多影像的保存被重疊了。 有沒有更好的方法來呼叫該函式一次并等待幾秒鐘(正好5秒鐘),直到歌曲結束而不中斷/暫停while回圈? 以下是我所做的代碼:
import cv2
import datetime
import threading
from playsound import playsound
def play_save(save_img)。
print("Saving Image")
time_stamp = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
file_name = f'selfie-{time_stamp}.png'。
cv2.imwrite(file_name, save_img)
print("播放歌曲")
playsound("Happy_birthday.mp3")
def main()。
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile_cascade = cv2.CascadeClassifier('haarcascade_smile.xml')
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
frame = img.copy()
if not ret:
break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(grey, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x w, y h), (255, 0, 0), 2)
roi_gray = gray[y:y h, x:x w)
roi_color = img[y:y h, x:x w] 。
smile = smile_cascade.detectMultiScale(roi_gray, 1.3, 25)
for x1, y1, w1, h1 in smile:
cv2.rectangle(img, (x1, y1), (x1 w1, y1 h1), (0, 0, 255), 2)
multithread = threading.Thread(target=play_save, args=(frame,))
multithread.start()
cv2.imshow('微笑生日', img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break: break.
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__"/span>:
main()
預先感謝!
uj5u.com熱心網友回復:
一個想法是使用UTC-Time來檢查它。你可以做一個這樣的檢查:
import time
time_function_done = None
while True:
#Do some shit #Do some shit
if (time_function_done 5) < time.time():
time_function_done = time.time()
#做你的函式。
#Do some other shit[/span
如果你找不到直接的解決方案,那就做一個變通方案。希望這對你有幫助:))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332530.html
標籤:
