'Kivy, XCamera: How can I solve Warning: 'can't open camera by index'?

System: Ubuntu: 21.10 Python: 3.8.8 Kivy: 2.0.0 KivyGraden: 0.1.4 XCamera: 2020.613

I'm trying to use XCamera in a multiwindow kivy app. Please help me to find a solution for the error. See main.py bla.kv and log below.

The app automatically interrupts while starting. My camera and cv2 seem to work properly. dev/video0 is part of my system as well.

main.py


from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import (
    NumericProperty, ReferenceListProperty, ObjectProperty
)
from kivy.config import Config
from kivy_garden.xcamera import XCamera


class MainWindow(Screen):
    text_input = ObjectProperty(None)

    def read(self):
        print('Text: ', self.text_input.text)
        self.text_input.text = ''
    pass

class SecondWindow(Screen):
    pass

class CamWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class ProjektApp(App):
    def build(self):
        return kv

kv = Builder.load_file('bla.kv')

if __name__ == '__main__':
    ProjektApp().run()

bla.kv

#: kivy 2.0.0
#: import XCamera kivy.garden.xcamera.XCamera

WindowManager:
    MainWindow:
    SecondWindow:
    CamWindow:


<Button>:
    font_size: 50
    color: .5,1,.7,1
    background_color: 0,0,1,1


<MainWindow>:
    name: 'main'

    text_input: input

    GridLayout:
        size: root.width, root.height
        cols: 2
        rows: 2

        Button:
            text: 'Scan'
            on_release:
                app.root.current = 'cam'
                root.manager.transition.direction = 'down'
        Button:
            text: 'Übersicht'
        Button:
            text: 'Top Secret'
            on_release: 
                app.root.current = 'second'
                root.manager.transition.direction = 'left'
        TextInput:
            id: input
            font_size: 50
            multiline: False

<SecondWindow>:
    name: 'second'
    Button:
        text: 'Wer das liest ist doof.'
        on_release: 
            app.root.current = 'main'
            root.manager.transition.direction = 'right'

<CamWindow>:
    name: 'cam'

    FloatLayout:
        XCamera:
            id: xcamera
        Button:
            text: 'back'
            on_release:
                app.root.current = 'main'
                root.manager.transition.direction = 'up'

LOG


[...]
[INFO   ] [Clipboard   ] Provider: xclip
[INFO   ] [CutBuffer   ] cut buffer support enabled
[DEBUG  ] [Atlas       ] Load </home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/data/images/defaulttheme.atlas>
[DEBUG  ] [Atlas       ] Need to load 1 images
[DEBUG  ] [Atlas       ] Load </home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/data/images/defaulttheme-0.png>
[DEBUG  ] [ImageSDL2   ] Load </home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/data/images/defaulttheme-0.png>
[DEBUG  ] Using opencv ver.4
[DEBUG  ] Using opencv ver.4
[ WARN:[email protected]] global /io/opencv/modules/videoio/src/cap_v4l.cpp (889) open VIDEOIO(V4L2:/dev/video0): can't open camera by index
 Traceback (most recent call last):
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/lang/builder.py", line 705, in _apply_rule
     setattr(widget_set, key, value)
   File "kivy/weakproxy.pyx", line 35, in kivy.weakproxy.WeakProxy.__setattr__
   File "kivy/properties.pyx", line 498, in kivy.properties.Property.__set__
   File "kivy/properties.pyx", line 840, in kivy.properties.ListProperty.set
   File "kivy/properties.pyx", line 545, in kivy.properties.Property.set
   File "kivy/properties.pyx", line 600, in kivy.properties.Property.dispatch
   File "kivy/_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
   File "kivy/_event.pyx", line 1154, in kivy._event.EventObservers._dispatch
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy_garden/xcamera/xcamera.py", line 85, in _on_index
     self._on_index_dispatch(*largs)
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy_garden/xcamera/xcamera.py", line 88, in _on_index_dispatch
     super()._on_index(*largs)
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/uix/camera.py", line 103, in _on_index
     self._camera = CoreCamera(index=self.index,
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/core/camera/camera_opencv.py", line 70, in __init__
     super(CameraOpenCV, self).__init__(**kwargs)
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/core/camera/__init__.py", line 70, in __init__
     self.init_camera()
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/core/camera/camera_opencv.py", line 120, in init_camera
     self._resolution = (int(frame.shape[1]), int(frame.shape[0]))
 AttributeError: 'NoneType' object has no attribute 'shape'
 
 During handling of the above exception, another exception occurred:
 
 Traceback (most recent call last):
   File "main.py", line 73, in <module>
     kv = Builder.load_file('bla.kv')
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/lang/builder.py", line 306, in load_file
     return self.load_string(data, **kwargs)
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/lang/builder.py", line 408, in load_string
     self._apply_rule(
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/lang/builder.py", line 661, in _apply_rule
     child.apply_class_lang_rules(
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/uix/widget.py", line 463, in apply_class_lang_rules
     Builder.apply(
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/lang/builder.py", line 541, in apply
     self._apply_rule(
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/lang/builder.py", line 663, in _apply_rule
     self._apply_rule(
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/lang/builder.py", line 661, in _apply_rule
     child.apply_class_lang_rules(
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/uix/widget.py", line 463, in apply_class_lang_rules
     Builder.apply(
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/lang/builder.py", line 541, in apply
     self._apply_rule(
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/lang/builder.py", line 710, in _apply_rule
     raise BuilderException(rule.ctx, rule.line,
 kivy.lang.builder.BuilderException: Parser: File "<inline>", line 28:
 ...
      26:
      27:    id: camera
 >>   28:    resolution: 640, 480 # 1920, 1080
      29:    allow_stretch: True
      30:
 ...
 AttributeError: 'NoneType' object has no attribute 'shape'
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/lang/builder.py", line 705, in _apply_rule
     setattr(widget_set, key, value)
   File "kivy/weakproxy.pyx", line 35, in kivy.weakproxy.WeakProxy.__setattr__
   File "kivy/properties.pyx", line 498, in kivy.properties.Property.__set__
   File "kivy/properties.pyx", line 840, in kivy.properties.ListProperty.set
   File "kivy/properties.pyx", line 545, in kivy.properties.Property.set
   File "kivy/properties.pyx", line 600, in kivy.properties.Property.dispatch
   File "kivy/_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
   File "kivy/_event.pyx", line 1154, in kivy._event.EventObservers._dispatch
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy_garden/xcamera/xcamera.py", line 85, in _on_index
     self._on_index_dispatch(*largs)
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy_garden/xcamera/xcamera.py", line 88, in _on_index_dispatch
     super()._on_index(*largs)
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/uix/camera.py", line 103, in _on_index
     self._camera = CoreCamera(index=self.index,
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/core/camera/camera_opencv.py", line 70, in __init__
     super(CameraOpenCV, self).__init__(**kwargs)
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/core/camera/__init__.py", line 70, in __init__
     self.init_camera()
   File "/home/joel/Projekte/kivy_venv/lib/python3.8/site-packages/kivy/core/camera/camera_opencv.py", line 120, in init_camera
     self._resolution = (int(frame.shape[1]), int(frame.shape[0]))


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source