How to display image in standard numpy/opencv/matplotlib format in Kivy? Kivy uses different image memory layout and I can't figure out which one.
The following code works totally fine. Image was captured using cv2 VideoCapture. I think image is BGR, array dimensions are (360, 480, 3):
ret, image = video_capture.read()
cv2.imshow('image', image)
cv2.waitKey()
Trying to display it with the following code produce messy results:
video_texture = Texture.create(size=image.shape[:2])
video_texture.blit_buffer(image.tostring(), colorfmt='rgb', bufferfmt='ubyte')
# ...
video_panel = self.ids['video_panel']
with video_panel.canvas:
Rectangle(texture=video_texture, pos=video_panel.pos, size=video_panel.size)
Found the right transformation. Probably suboptimal:
ret, image = video_capture.read()
image = np.rot90(np.swapaxes(image, 0, 1))
video_texture = Texture.create(size=(image.shape[1], image.shape[0]), colorfmt='rgb')
video_texture.blit_buffer(image.tostring(), colorfmt='bgr', bufferfmt='ubyte')
I found that the rotation can also be done using the numpy function flipud(), not sure if it is actually faster (I'm not that experienced with python/numpy) but for some this might be more logical to read instead of the 90 degrees rotation and the swapaxes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With