Przede wszystkim jestem całkowicie nowy w kivy, więc trochę się zmagam.Wyświetl tablicę numpy w Kivy
Próbuję wyświetlić tablicę numpy w oknie kivy. Do tej pory stwierdziłem, że to powinno działać przy użyciu klasy Texture (http://kivy.org/docs/api-kivy.graphics.texture.html).
Ponieważ moja zmienna tablica zmienia się od czasu do czasu, próbuję dopasować poniższy kod do mojej aplikacji.
# create a 64x64 texture, defaults to rgb/ubyte
texture = Texture.create(size=(64, 64))
# create 64x64 rgb tab, and fill with values from 0 to 255
# we'll have a gradient from black to white
size = 64 * 64 * 3
buf = [int(x * 255/size) for x in range(size)]
# then, convert the array to a ubyte string
buf = b''.join(map(chr, buf))
# then blit the buffer
texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte')
# that's all ! you can use it in your graphics now :)
# if self is a widget, you can do this
with self.canvas:
Rectangle(texture=texture, pos=self.pos, size=(64, 64))
Wydaje się, że tworząc fakturę i zmieniając to działa tak jak powinno, ale ja dont dostać, jak wyświetlić fakturę.
Czy ktoś może mi wyjaśnić, w jaki sposób korzystać z
with self.canvas:
Rectangle(texture=texture, pos=self.pos, size=(64, 64))
w taki sposób, że mogę zobaczyć moje zdjęcie/numpy tablicy.
Dziękuję z góry! Holzroller
Edytuj: Wyjaśniłem, że używanie Kivy 1.8.0 i klasy tekstur jest trochę nieporządne. Więc uaktualniłem do Kivy 1.9.0 przez github (instalując Kivy przez apt-get w Ubuntu 14.04 LTS obsługuje wersję 1.8.0) i widzę teksturę za pomocą następującego kodu. Mam nadzieję, że pomaga to ludziom, którzy mają ten sam problem co ja.
from kivy.graphics.texture import Texture
from kivy.graphics import Rectangle
from kivy.uix.widget import Widget
from kivy.base import runTouchApp
from array import array
from kivy.core.window import Window
# create a 64x64 texture, defaults to rgb/ubyte
texture = Texture.create(size=(1280, 1024), colorfmt='rgb')
# create 64x64 rgb tab, and fill with values from 0 to 255
# we'll have a gradient from black to white
size = 1280 * 1024 * 3
buf = [int(x * 255/size) for x in range(size)]
# then, convert the array to a ubyte string
arr = array('B', buf)
# buf = b''.join(map(chr, buf))
# then blit the buffer
texture.blit_buffer(arr, colorfmt='rgb', bufferfmt='ubyte')
# that's all ! you can use it in your graphics now :)
# if self is a widget, you can do this
root = Widget()
with root.canvas:
Rectangle(texture=texture, pos=(0, 0), size=(1280*3, 1024*3))
runTouchApp(root)
Edit2: Zasadniczo jestem z powrotem do pierwotnego problemu: Mam tablicę numpy (typ 'numpy.ndarray'; dtype 'Uint8') i staram się przekształcić go w format, aby tekstura pokazała mi obraz. Próbowałem go rozbić w taki sam sposób jak w przykładowym kodzie zamieszczonym powyżej. Ale niestety nie działa. Naprawdę nie wiem, co robię źle tutaj. (mój numpy tablicy nazywa IM2 w kodzie folling)
list1 = numpy.array(im2).reshape(-1,).tolist()
arr = array('B', list1)
texture.blit_buffer(arr, colorfmt='rgb', bufferfmt='ubyte')
Anks, próbowałem tego bevor. Może moja wina polega na aktualizacji tej tablicy. Więc spróbuję wyjaśnić całą moją aplikację. Otrzymuję obraz za pośrednictwem węzła ROS. Przywracam ten obraz do formatu rgb im2 = CvBridge(). Imgmsg_to_cv2 (dane, "rgb8"), więc w zasadzie wracam do tablicy numpy. Subskrybent ROS ma funkcję zwrotną, w której teksturę zmieniono. Ale nie widzę tej zmiany. Być może staje się bardziej jasne, gdy spojrzysz na: (https://gist.github.com/Holzroller/1ec092ce798afd9c8b34) – Holzroller
na 1.Nie uważam, że aktualizacja jest ignorowana, dlatego dodałem funkcję drukowania, aby sprawdzić, czy wywołanie zwrotne jest wykonywane. Co więcej, udało mi się wyeksportować obraz otrzymany przez ROS w formacie JPEG z wykorzystaniem OpenCV. do 2. Dodałem self.canvas.ask_update() w każdej funkcji, ale niestety ja nie dostać, aby zobaczyć zdjęcie :( Tak czy inaczej, bardzo dziękuję za wsparcie https:.! // istota .github.com/Holzroller/2f7f95b0958d6e406667 – Holzroller
Nie ignorowane w pythonie, ignorowane w GL, ponieważ nie ma Cię w głównym wątku, ale normalnie, jeśli nie, to się zawiesza. Wciąż nie rozumiem, jak opencv/ros wywołaj wywołanie zwrotne bez udziału w mainthread – tito