2017-12-08 24 views
0

kivyキャンバスからケラスモデル(ニューラルネットワーク)にピクセルを渡したいと思います。シンプルなアプローチは、イメージをpngにエクスポートし、scikit-imageまたはPILを使用してイメージを読み取ることです。このような冗長なステップがなければ、メモリ内でこれを行うことができますか?すべてがimgがPNGとして保存して、動作するかどうかをチェックするためにはkivyキャンバステクスチャのメモリへの処理

fbo = Fbo() 
fbo.add(self.canvas) 
fbo.draw() 
img = Image.frombytes('RGBA', img_size, fbo.pixels) 

:これは私が思い付いたものです

。残念ながら、それは完全な混乱であることが判明しました。私の質問は、どうすれば正しく動作するのですか?

from PIL import Image 
from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.button import Button 
from kivy.graphics import Line, Fbo 
from kivy.uix.floatlayout import FloatLayout 

class Painter(Widget): 

    def on_touch_down(self, touch): 
     with self.canvas: 
      touch.ud['line'] = Line(points=(touch.x, touch.y), width=50) 

    def on_touch_move(self, touch): 
     touch.ud['line'].points += [touch.x, touch.y] 

    def save(self, obj): 

     fbo = Fbo() 
     fbo.add(self.canvas) 
     fbo.draw() 
     img = Image.frombytes('RGBA', self.size, fbo.pixels) 
     img.save('img.png') 

class App(App): 

    def build(self): 
     layout = FloatLayout() 
     painter = Painter() 
     btn = Button(text='Save', on_release=painter.save, size_hint=(0.2,0.2)) 

     layout.add_widget(painter) 
     layout.add_widget(btn) 
     return layout 

App().run() 

答えて

0

すべてkivyウィジェットはあなたをこのウィジェットのキャンバスのpng画像を保存することができexport_to_png方法を持っているので、代わりのFBO及びPIL画像を使用して:ここで

が再現/この問題を示したコードですそれを使用することができます。このような

何か:

... 

class Painter(Widget): 

    ... 

    def save(self, *args): 
     self.export_to_png(filename='img') 

    ... 
... 
+0

はい、うまくいきますが、郵便局を経由してフラットメイトに小包を送るのと同じように見えます。この 'export_to_png'メソッドは既にキャンバスを符号なしバイトに変換します。問題は、それらを直接使用する方法です – user8856277

0

あなたはread the sourceできWidget.export_to_png作品は、その後、同様の方法を自分で使用方法を確認します。テクスチャがあれば、おそらくpixels attributeから必要なピクセル情報を得ることができます。

ウィジェットのキャンバスをFboに置き換えることで、毎回新しいキャンバスを作成する必要がなくなります。

関連する問題