Выпуск бесплатных ресурсов Kivy Camera - PullRequest
0 голосов
/ 16 февраля 2020

Я хочу использовать камеру для захвата фотографий и сканирования штрих-кода в моем приложении Android. Я добавил его в kv:

<CameraForm>:
    FloatLayout:
        Camera:
            id: camera
            size_hint: (1, 0.8)
            pos_hint: {"center_x": 0.5, "top": 0.95}
            canvas.before:
                PushMatrix
                Rotate:
                    angle: -90 if app.isAndroid() else 0
                    origin: self.center
            canvas.after:
                PopMatrix

        MDRaisedButton:
            text: "Capture"
            size_hint: (None, None)
            height: "40dp"
            pos_hint: {"x": 0.2, "top": 0.1}
            on_press: root.capturePhoto()

и python код:

class CameraForm(Screen):
    def __init__(self, *args, **kwargs):
        super(CameraForm, self).__init__(*args, **kwargs)
        self.fileName = None
        self.camera = None

    def initCamera(self):
        self.camera = self.ids.camera
        self.camera.resolution = (720, 480)
        self.camera.keep_ratio = True
        self.camera.play = True
        self.camera.allow_stretch = True

    def on_enter(self, *args):
        self.initCamera()

    def capturePhoto(self):
        imgTime = time.strftime("%Y%m%d_%H%M%S")
        self.fileName = MDApp.get_running_app().imagePath + "IMG_{}.png".format(imgTime)  # store image file
        self.camera.export_to_png(self.fileName)
        msgBox = MessageBox()
        msgBox.showMsg("Information", "Image has been successfully captured!", "OK", False)

Аналогичный код, который я имею для камеры для сканирования штрих-кода. Проблема заключается в том, что когда я пытаюсь переключиться с камеры на камеру со штрих-кодом, у меня возникают следующие проблемы:

[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1113) SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -1072873821
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1125) SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -1072873821
[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1159) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -1072873821
[ERROR  ] [OpenCV      ] Couldn't get image from Camera
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\kivy\core\camera\camera_opencv.py", line 144, in _update
    self._buffer = frame.imageData
AttributeError: 'NoneType' object has no attribute 'imageData'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\kivy\core\camera\camera_opencv.py", line 148, in _update
    self._buffer = frame.reshape(-1)
AttributeError: 'NoneType' object has no attribute 'reshape'
[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1159) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638
[ERROR  ] [OpenCV      ] Couldn't get image from Camera
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\kivy\core\camera\camera_opencv.py", line 144, in _update
    self._buffer = frame.imageData
AttributeError: 'NoneType' object has no attribute 'imageData'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\kivy\core\camera\camera_opencv.py", line 148, in _update
    self._buffer = frame.reshape(-1)
AttributeError: 'NoneType' object has no attribute 'reshape'

, и приложение вылетает. Итак, я думаю, что нужно освободить ресурсы камеры.

def on_leave(self, *args):
    self.camera.stop()

Когда я пытаюсь выйти из экрана камеры, он сообщает об ошибке:

AttributeError: 'Camera' object has no attribute 'stop'

Но из kivy docs: https://kivy.org/doc/stable/api-kivy.core.camera.html#kivy .core.camera.CameraBase.stop

stop () Добавлено в 1.0.0 Отпустите камеру

Итак почему stop() недоступно для Camera? Как освободить ресурсы Camera? Спасибо за помощь.

1 Ответ

1 голос
/ 16 февраля 2020

В классе kivy.core.camera.CameraBase есть метод stop(), но виджет Camera (в вашем файле .kv) является экземпляром класса kivy.uix.camera.Camera и не имеет метода stop().

Если вы хотите остановить камеру, вы можете использовать play свойство Camera. Камера делает c.

В противном случае вы можете использовать self.camera._camera для прямого доступа к экземпляру CoreCamera в Camera (но я не уверен, рекомендуется ли это).

Я рекомендую вам взглянуть на Источники камеры для лучшего понимания, особенно линии 102 и определения on_play () .

...