Как запустить приложение камеры Kivy в режиме без головы? - PullRequest
1 голос
/ 22 апреля 2019

надеюсь, у вас все хорошо, я пытаюсь использовать "безголовую" службу камер, но camera._camera.bind() выглядит как не работающая, если не является частью LayOut, вот "Практически минимальный пример камеры с графическим интерфейсом", который работает:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
import time
import PIL
from kivy.uix.camera import Camera

Builder.load_string('''
<CameraClick>:
    orientation: 'vertical'
    ToggleButton:
        text: 'Play'
        on_press: root.camera.play = not root.camera.play
        size_hint_y: None
        height: '48dp'
    Button:
        text: 'Capture'
        size_hint_y: None
        height: '48dp'
        on_press: root.capture()
''')


class CameraClick(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.camera = Camera(play=False, resolution=(640, 480))
        self.camera._camera.bind(on_texture=self.capture)

    def capture(self, instance=None):
        '''
        Function to capture the images and give them the names
        according to their captured time and date.
        '''
        camera = instance or self.camera
        print(type(camera), camera)
        texture = camera.texture
        image_data = texture.pixels
        size = texture.size
        fmt = texture.colorfmt.upper()
        timestr = time.strftime("%Y%m%d_%H%M%S")
        pil_image = PIL.Image.frombytes(mode=fmt, size=size, data=image_data)
        pil_image.save("IMG_{}.png".format(timestr))
        print("Captured")


class TestCamera(App):

    def build(self):
        return CameraClick()


TestCamera().run()

А вот мой минимальный пример без графического интерфейса, который не работает:

from kivy.uix.camera import Camera
import time
import PIL

def capture(instance):
    camera = instance
    texture = camera.texture
    image_data = texture.pixels
    size = texture.size
    fmt = texture.colorfmt.upper()
    timestr = time.strftime("%Y%m%d_%H%M%S")
    pil_image = PIL.Image.frombytes(mode=fmt, size=size, data=image_data)
    pil_image.save("IMG_{}.png".format(timestr))
    print("Captured")

c = Camera(play=False, resolution=(640, 480))
c._camera.bind(on_texture=capture)
c.play = True
print("Taking 5 seconds of photos...")
sleep(5)
print("Turning off taking photos")
c.play = False

Так, в примере с графическим интерфейсом, когда я нажимаю на воспроизведение, это работает, что является простым camera.play = True, и когда я делаю camera.play = True на минимальной камере без графического интерфейса, функция захвата никогда не вызывается.

Что я делаю не так?

РЕДАКТИРОВАТЬ: от Matham (см. Комментарий github): Кажется, вы блокируете основной поток kivy. Вы не можете запустить kivy в режиме "без головы", так как графический интерфейс всегда должен работать, а основной поток не может быть заблокирован, https://github.com/kivy/kivy/issues/6272#issuecomment-486489264

Так что я думаю, что мне нужно реализовать камеру, используя pyjnius

...