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的保留门路。