Киви текстуры из массива печати много раз - PullRequest
0 голосов
/ 04 июля 2018

У меня есть изображение в массиве из Matlab. Я хочу напечатать это изображение в киви.

# encoding: utf-8

import time
import matlab.engine

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle
from kivy.graphics.texture import Texture

engine = matlab.engine.start_matlab("-nodesktop -noFigureWindows")


class kivyTest(Widget):

    def __init__(self):
        super(kivyTest, self).__init__()
        self.texture = Texture.create(size=(560, 420), colorfmt="rgb")
        time_eng, data_pict = engine.test_pict_data(4.0, 5.0, nargout=2)
        self.texture.blit_buffer(data_pict._data, bufferfmt="ubyte", colorfmt="rgb")
        with self.canvas:
            Rectangle(pos=self.pos, size=(560, 420), texture=self.texture)

    def on_touch_down(self, touch):
        x = touch.pos[0]
        y = touch.pos[1]
        time_eng, data_pict = engine.test_pict_data(x, y, nargout=2)
        self.texture.blit_buffer(data_pict._data, bufferfmt="ubyte", colorfmt="rgb")
        super().on_touch_down(touch)
        self.canvas.ask_update()


class my_app(App):
    title = 'Matlab raw data picture test'
    def build(self):
        return kivyTest()


if __name__ == '__main__':
    my_app().run()

размер data_pict._data 560x420x3 uint8 в одномерном массиве Но когда я печатаю здесь, это результат:

Strange picture print multi tiles

Обычный результат должен выглядеть примерно так: Matlab sin

Есть ли у вас какие-либо идеи об этом поведении?

1 Ответ

0 голосов
/ 05 июля 2018

Хорошо, я нашел способ

Я считаю, что данные 1D из matlab (pictureFrame.cdata._data) непригодны для использования, так как нам нужно реорганизовать их с помощью numpy и выровнять их при переходе к текстуре.

data_reorg = np.array(data_pict._data).reshape(data_pict.size, order='F')
self.texture.blit_buffer(data_reorg.ravel(), bufferfmt="ubyte", colorfmt="rgb")

Этот способ быстрый и эффективный.

...