надеюсь, у вас все хорошо, я пытаюсь использовать "безголовую" службу камер, но 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