Mycroft 是一款语音助手,官网文档 https://mycroft.ai/
问题景象
Mycroft 执行拍照性能时产生的问题:
如果间接在 intent 里调用拍照函数,第二次无奈关上
然而函数自身是没有问题的,单个文件运行拍照函数,能够反复运行
import cv2
import time
def take_photo():
print('take photo process start')
cap = cv2.VideoCapture(0)
img_name = 'cap_img_' + str(time.time()) + '.jpg'
# Change this variable to the path you want to store the image
img_path = 'xxx/' + img_name
#<-- Take photo in specific time duration -->
cout = 0
while True:
ret, frame = cap.read()
cv2.waitKey(1)
cv2.imshow('capture', frame)
cout += 1
if cout == 50:
cv2.imwrite(img_path, frame)
break
cap.release()
cv2.destroyAllWindows()
print('take photo process end')
take_photo()
如何解决
参考这个 skill https://github.com/eClarity/s…
在调用拍照性能时,用了过程池。
所以狐疑,单个文件调用时,因为程序退出,照相机失常敞开;
但在 Mycroft 的 intent 里调用,cap.release()
可能因为什么起因,没有失常敞开照相机,所以用一个过程独自调用,而后过程敞开,照相机就能够失常敞开。
@intent_handler('example.intent')
def handle_take_photo(self, message):
self.speak_dialog('take.photo')
self.img_multi = ''self.img_hand =''
img_queue = Queue()
take_photo_process = Process(target=take_photo, args=(img_queue,))
take_photo_process.daemon = True
take_photo_process.start()
take_photo_process.join()
self.img_multi = img_queue.get()
self.speak('something')
这里遇到了一个新问题,原本想间接传输 nparray,也就是 image,然而不晓得为什么不能获取到,img_queue.get()
获取不到,猜想是太大了。起初换成传输 image 的保留门路。