乐趣区

关于自然语言处理:Mycroft-camera

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

退出移动版