2014-11-26 29 views
6

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') 

Odpowiedz

5

Numpy mieć atrybut tostring(), że można użyć bezpośrednio, jeśli tablica jest źródłem Uint8 typu. Nie trzeba nawet do przekształcenia:

texture = Texture.create(size=(16, 16), colorfmt="rgb")) 
arr = numpy.ndarray(shape=[16, 16, 3], dtype=numpy.uint8) 
# fill your numpy array here 
data = arr.tostring() 
texture.blit_buffer(data, bufferfmt="ubyte", colorfmt="rgb" 

o problemie z którą rozmawiasz w komentarzu widzę 2 punkty:

  1. zapewnienia zwrotnego z ROS jest nazywany w mainthread. Może aktualizacja jest po prostu ignorowana.
  2. Gdy ręcznie zmieniasz teksturę, powiązany obiekt, który jej używa, nie jest powiadamiany, musisz to zrobić. Dodaj self.canvas.ask_update(), aby zapewnić wyświetlanie kanwy w następnej klatce.
+0

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

+0

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

+1

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