wxpythonとvtkでビデオプレーヤー作ってみる。その3。vtkImageViewerでjpeg表示。
目次
- その0。wxpythonのウィンドウ内部にvtkを表示するパネルを作ってみた
- その1。C++のJpeg表示サンプルをPythonに翻訳。
- その2。numpyアレイで用意した2Dテクスチャを四角ポリゴンに貼る。
- その3。vtkImageViewerでjpeg表示。
- その4。vtkImageViewerでnumpyアレイ表示。
- その5。完成。opencvとvtkImageViewerで読み込み・表示。
前置き
vtk使い始めなので、とりあえずなんか作ってみるという意味でビデオプレーヤーを作っていく企画の第3弾です。
vtkImageViewerを使ってみる
前回ちろっと触れましたが、vtkImageViewerというハイレベルなクラスが用意されているので、前回やったようにローレベルなポリゴンの設定とかはすっ飛ばすことが可能だった模様です。というわけで今回はvtkImageViewerをつかってやり直してみました。
画像サイズに合わせてウィンドウのサイズをリサイズしたかったのですが、vtkにはjpegReaderやtiffReadergが用意されています。
imageData = jpegReader.GetOutput() w,h,z = imageData.GetDimensions()
としてからimageDataの下のメソッドでいろいろと画像の情報を取ってこれるようです。vtkは中身C++なので速いし、Pythonで実装されている部分が多いPILやpillowなんかの代わりとしても強力そうですね。
今回のコード
例によってメーリングリストにあった例を適当にいじってwxで使えるようにした程度です。
wx.Frame.__init__(self, None, title='TextureMapQuad', size=(w+40,h+100))
前回もそうしましたが、フレームを画像サイズより大きめにした上でpanelを置かないと、どうも後からリサイズしてもpanelが小さいままという問題があったためにハッキッシュなトリックをしています。すでに画像サイズにしたpanelをプロポーション1でEXPANDオプションつけてsizerに追加して、あとからFrameのFitを呼んでいるので、これでいいはずと思うんだけど。wxのsizerは時折わけわからない動作をするのであまり綺麗にデバックしないように心がけていたりする今日このごろ。追記)あほな単純ミスでした。panelをsizerに置いたつもりがvtkのrendererのrwiを置いてしまっているのでいけなかっただけでした。コードも修正。
import vtk
from vtk.wx.wxVTKRenderWindow import wxVTKRenderWindow
import wx
class Test(wx.Frame):
def __init__ (self, fp):
w,h,z,render = self.SetupRender(fp)
wx.Frame.__init__(self, None, title='vtkImageViewer')
canvas = wx.Panel(self, size=(w,h))
rwi = wxVTKRenderWindow(canvas, -1)
rwi.Enable(True)
rwi.GetRenderWindow().AddRenderer(render)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(canvas, 1, wx.EXPAND)
self.SetSizerAndFit(sizer)
self.Layout()
self.Show()
@staticmethod
def SetupRender(fp):
jpegReader = vtk.vtkJPEGReader()
jpegReader.SetFileName( fp )
jpegReader.Update()
imageData = jpegReader.GetOutput()
w,h,z = imageData.GetDimensions()
imageviewer = vtk.vtkImageViewer()
imageviewer.SetInputConnection( jpegReader.GetOutputPort() )
imageviewer.SetColorWindow( 255 );
imageviewer.SetColorLevel ( 128 );
renderer = vtk.vtkRenderer()
renderer.AddActor(imageviewer.GetActor2D())
return w,h,z,renderer
if __name__ == '__main__':
app = wx.App(0)
frame = Test( "C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg" )
app.MainLoop()
« wxpythonとvtkでビデオプレーヤー作ってみる。その2。numpyアレイで用意した2Dテクスチャを四角ポリゴンに貼る。 | トップページ | wxpythonとvtkでビデオプレーヤー作ってみる。その4。vtkImageViewerでnumpyアレイ表示。 »
「Python」カテゴリの記事
- Noteの記事をPythonでバックアップしといた。(2021.05.05)
- JupyterLabでも好きな外部エディターを使いたい!(2018.05.02)
- ローカルエリア内のJupyterLabサーバーにLAN経由で接続する。(2018.05.02)
- Juliaやってみよう。五日目。Pythonと速度比較。(2017.08.01)
- Juliaやってみよう。四日目。@timeでプロファイリング(2017.07.16)
« wxpythonとvtkでビデオプレーヤー作ってみる。その2。numpyアレイで用意した2Dテクスチャを四角ポリゴンに貼る。 | トップページ | wxpythonとvtkでビデオプレーヤー作ってみる。その4。vtkImageViewerでnumpyアレイ表示。 »




コメント