Mycroft是一款语音助手,官网文档 https://mycroft.ai/
问题景象
Mycroft执行拍照性能时产生的问题:
如果间接在intent里调用拍照函数,第二次无奈关上
然而函数自身是没有问题的,单个文件运行拍照函数,能够反复运行
import cv2import timedef 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的保留门路。