-
-
Save ExpandOcean/de261e66949009f44ad2 to your computer and use it in GitHub Desktop.
# coding:utf-8 | |
from kivy.app import App | |
from kivy.uix.image import Image | |
from kivy.clock import Clock | |
from kivy.graphics.texture import Texture | |
import cv2 | |
class KivyCamera(Image): | |
def __init__(self, capture, fps, **kwargs): | |
super(KivyCamera, self).__init__(**kwargs) | |
self.capture = capture | |
Clock.schedule_interval(self.update, 1.0 / fps) | |
def update(self, dt): | |
ret, frame = self.capture.read() | |
if ret: | |
# convert it to texture | |
buf1 = cv2.flip(frame, 0) | |
buf = buf1.tostring() | |
image_texture = Texture.create( | |
size=(frame.shape[1], frame.shape[0]), colorfmt='bgr') | |
image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte') | |
# display image from the texture | |
self.texture = image_texture | |
class CamApp(App): | |
def build(self): | |
self.capture = cv2.VideoCapture(1) | |
self.my_camera = KivyCamera(capture=self.capture, fps=30) | |
return self.my_camera | |
def on_stop(self): | |
#without this, app will not exit even if the window is closed | |
self.capture.release() | |
if __name__ == '__main__': | |
CamApp().run() |
Has anyone succeeded in making an Android camera with Python using OpenCv?
Below is the code that succeeded in another way.
-- below --
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
import time
from android.permissions import request_permissions, Permission
request_permissions([Permission.CAMERA])
Builder.load_string('''
:
orientation: 'vertical'
Camera:
id: camera
resolution: (1280, 720)
play: False
ToggleButton:
text: 'Play'
on_press: camera.play = not 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 capture(self):
camera = self.ids['camera']
timestr = time.strftime("%Y%m%d_%H%M%S")
camera.export_to_png("IMG_{}.png".format(timestr))
print("Captured")
class TestCamera(App):
def build(self):
return CameraClick()
TestCamera().run()
I tried running it on a Raspberry Pi and it runs pretty slow. Do you have any optimizations for that?
Threads?
I don't know if anyone is still interested in this, but since it took me three days to get there, here is a "minimal" example of OpenCV VideoCapture displaying frame by frame on Android:
I couldn't get this to work. The code ran ok but only for one frame after which the Kivy window closed.
@DunZek have you figured this one out?