wxpythonとvtkでビデオプレーヤー作ってみる。その5。完成。opencvとvtkImageViewerで読み込み・表示。
目次
- その0。wxpythonのウィンドウ内部にvtkを表示するパネルを作ってみた
- その1。C++のJpeg表示サンプルをPythonに翻訳。
- その2。numpyアレイで用意した2Dテクスチャを四角ポリゴンに貼る。
- その3。vtkImageViewerでjpeg表示。
- その4。vtkImageViewerでnumpyアレイ表示。
- その5。完成。opencvとvtkImageViewerで読み込み・表示。
とりあえず出来たwxVTKRenderWindowでつくるビデオプレーヤー
前回よりだいぶ間が開いてしまいましたが、wxpythonとvtkでビデオプレーヤー作ってみるシリーズその5で最終回です。opencvでビデオを読んでnumpyアレイとして画像を得て、これをvtkImageViewerで表示するという流れで作ってみました。わざわざvtk使う必要がまったくないですが、まあ練習です。
注意点は、opencvとvtkImageViewerでは画像のフォーマットに2つ違いがあること。一つは色でopencvはRGBじゃなくってBGR。もう一つはnumpyアレイの最初の次元はy軸だけど、これが(0,0)が左上なのか左下なのかという違いのせいでy座標を上下逆さにする必要もある。上下逆さに関してはカメラを回転させればいいじゃんとおもい、
renderer.GetActiveCamera().Azimuth(180)
とかやってみたが、wxに埋め込んだせいか、なぜかカメラの設定は何を変えても影響がなかった。actorの方はPositionとか変えるとちゃんと変化するのでactorの方でやろうかとおもったが、actor2DにはRotateZメソッドがない(普通の2Dじゃない普通のactorならある)。vtkでウィンドウ出した場合はこれで大丈夫なはずなので、wxVTKRenderWindowをつかっている為かなぁ。
opencvのウィンドウをwxに埋め込めたらいいんだけど、C++なら多分可能だろうけど、wxpythonではちょっとやり方がわからない。
ちょっとスピードアップ
dataImporter.SetImportVoidPointerを使うことで、numpyアレイのコピーなしでvtkImageViewerをアップデートできることが分かったので、ちょっとスピードアップしました。前回のコードでは
self.dataImporter.CopyImportVoidPointer(data_matrix, data_matrix.nbytes) self.imageViewer.SetInputConnection( self.dataImporter.GetOutputPort() ) self.Refresh()
とやっていたが、CopyImportVoidPointerだとnumpyアレイがコピーされてしまうので、遅い。そのため、SetImportVoidPointer(self.data_matrix)としてnumpyアレイをそのまま渡してやるとnumpyアレイがあるメモリのポインターを見つけて来る。numpyアレイバッファーがそのまま画像データになるらしく、ImageViewer.SetInputConnectionは要らなくなった。
FPSについて
ビデオのFPSの値でwx.Timerイベントを発生させるようにtimer.Start(1000.0/self.fps)という感じでフレームの更新をしていますが、これだと微妙に遅れがちです。timer.Start()に渡す値を上げればちゃんと速くなるのでマシンの限界ではなく、処理の仕方がアホなんだとおもいます。
正確なFPSで表示するには、もうちょっと工夫しないといけないようですね。画像バッファーの更新を行うタイミングが、wx.Timerイベントの発生後なのがいけないのではと思い、タイマーイベントではself.Refresh()を先に行うようにし、リフレッシュの直後に画像バッファーの更新としてみたがダメ。ふーむ。まあいいか。
今回のコード
使い方:ビデオファイルをドロップすると、ファイルが開かれて、Playボタン、スライダーバー等が有効になる。
import cv2
import cv2.cv as cv
import numpy as np
import vtk
from vtk.wx.wxVTKRenderWindow import wxVTKRenderWindow
import wx
class FileDrop(wx.FileDropTarget):
def __init__(self, parent):
wx.FileDropTarget.__init__(self)
self.parent = parent
def OnDropFiles(self, x, y, filenames):
fp = filenames[0] # I need one file only. discard others.
self.parent.initialize(fp)
class Test(wx.Frame):
def __init__ (self):
wx.Frame.__init__(self, None, title='vtkImageViewer')
self.SetBackgroundColour('#EEEEEE')
self.SetDropTarget(FileDrop(self))
self.canvas = wx.Panel(self, size=(640/2,480/2))
self.playbtn = wx.Button(self, -1, 'Play')
self.playbtn.Bind(wx.EVT_BUTTON, self.OnPlaybtn)
self.playbtn.Enable(False)
self.stopbtn = wx.Button(self, -1, 'Stop')
self.stopbtn.Bind(wx.EVT_BUTTON, self.OnStopbtn)
self.stopbtn.Enable(False)
self.slider = wx.Slider( self, -1, 0,
minValue=1, maxValue=1, style=wx.SL_HORIZONTAL )
self.slider.Bind(wx.EVT_SLIDER, self.OnSlider)
self.slider.Enable(False)
hbox = wx.BoxSizer(wx.HORIZONTAL)
hbox.Add(self.playbtn, 0, wx.EXPAND|wx.ALL, border=2)
hbox.Add(self.stopbtn, 0, wx.EXPAND|wx.ALL, border=2)
hbox.Add(self.slider, 1, wx.EXPAND|wx.ALL, border=5)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.canvas, 1, wx.EXPAND)
sizer.Add(hbox, 0, wx.EXPAND)
self.SetSizerAndFit(sizer)
self.Layout()
self.Show()
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
self.playing = False
self.current_position = 0
def initialize(self, fp):
self.capture = cv2.VideoCapture(fp)
success, self.data_matrix = self.capture.read()
if not success:
dlg = wx.MessageDialog(
self,
"%s\nInput file is not supported" % fp,
'A Message Box',
wx.OK | wx.ICON_INFORMATION )
dlg.ShowModal()
dlg.Destroy()
return
h,w,_ = self.data_matrix.shape
max_frame = int(self.capture.get(cv.CV_CAP_PROP_FRAME_COUNT))
self.fps = self.capture.get(cv.CV_CAP_PROP_FPS)
self.timer.Start(1000.0/self.fps)
self.canvas.DestroyChildren()
self.canvas.SetMinSize( (w, h) )
self.SetSize( self.GetSizer().ComputeFittingClientSize(self) )
self.Layout()
# Set a numpy array up and import it to vtk
dataImporter = vtk.vtkImageImport()
dataImporter.SetImportVoidPointer(self.data_matrix)
dataImporter.SetDataScalarTypeToUnsignedChar()
dataImporter.SetNumberOfScalarComponents(3)
dataImporter.SetDataExtent(0, w-1, 0, h-1, 0, 0)
dataImporter.SetWholeExtent(0, w-1, 0, h-1, 0, 0)
self.dataImporter = dataImporter
imageViewer = vtk.vtkImageViewer()
imageViewer.SetInputConnection( dataImporter.GetOutputPort() )
imageViewer.SetColorWindow( 255 )
imageViewer.SetColorLevel ( 128 )
actor = imageViewer.GetActor2D()
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)
#cam = renderer.GetActiveCamera().Azimuth(180) # no effect?
rwi = wxVTKRenderWindow(self.canvas, -1)
rwi.GetRenderWindow().AddRenderer(renderer)
self.playbtn.Enable(True)
self.stopbtn.Enable(True)
self.slider.Enable(True)
self.slider.SetMax(max_frame-1)
self.slider.SetValue(0)
self.updateimg(None)
def updateimg(self, event):
success, self.data_matrix = self.capture.read()
# opencv uses BGR and y-axis is flipped. slow here
self.data_matrix = cv2.cvtColor( self.data_matrix, cv.CV_BGR2RGB)
self.data_matrix = cv2.flip( self.data_matrix, 0 )
self.dataImporter.SetImportVoidPointer(self.data_matrix)
self.Refresh()
def changeTitle(self, current_position):
self.SetTitle(
'vtkImageViewer Elasped %2.2f (s)' %
(current_position / self.fps) )
def OnTimer(self, event):
if self.playing:
current_position = self.capture.get(cv.CV_CAP_PROP_POS_FRAMES)
self.changeTitle(current_position)
self.slider.SetValue(current_position)
self.updateimg(event)
def OnSlider(self, event):
current_position = self.slider.GetValue()
self.capture.set(cv.CV_CAP_PROP_POS_FRAMES, current_position)
self.changeTitle(current_position)
self.updateimg(event)
def OnStopbtn(self, event):
self.capture.set(cv.CV_CAP_PROP_POS_FRAMES, 0)
self.updateimg(event)
self.slider.SetValue(0)
self.changeTitle(0)
self.playing = False
self.playbtn.SetLabel('Play')
def OnPlaybtn(self, event):
if self.playing:
self.playbtn.SetLabel('Play')
else:
self.playbtn.SetLabel('Pause')
self.playing = (self.playing == False)
if __name__ == '__main__':
app = wx.App(0)
frame = Test()
app.MainLoop()
« wxpythonとvtkでビデオプレーヤー作ってみる。その4。vtkImageViewerでnumpyアレイ表示。 | トップページ | スクラッチとはこうやるのさ。子犬のDJの技がすごすぎる件。 »
「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でビデオプレーヤー作ってみる。その4。vtkImageViewerでnumpyアレイ表示。 | トップページ | スクラッチとはこうやるのさ。子犬のDJの技がすごすぎる件。 »
https://www.cheapadidasshoes.us.org/
https://www.nbastorecanada.ca/
https://www.jordan25.us/
https://www.jordans33.us/
https://www.wholesaleshoesclothing.us/
https://www.air-max2019.us.org/
https://www.jordan2s.us/
https://www.jordan19.us/
https://www.nikeairmaxs.us.org/
https://www.wholesaleshoessneakers.us/
https://www.nikeshops.us.com/
https://www.nike-runningshoes.us.org/
https://www.jordan30.us/
https://www.nikemetcons.us.com/
https://www.jordan21.us/
https://www.huaracheshoes.us.com/
https://www.jordanswholesale.us.org/
https://www.jordan33.us.org/
https://www.nikeairmaxs-270.us.com/
https://www.christianlouboutinshoess.us.com/
https://www.jordan26.us/
https://www.jordan31.us/
https://www.nikeairforce1s.us.org/
https://www.nikeoutletstoreonlines.us.org/
https://www.wholesalejordans.us.org/
https://www.cheapjordanshoessuppliers.us.org/
https://www.cheapshoeswholesalefreeshipping.us/
https://www.cheapjordansshoeswholesale.us.org/
https://www.nikeairforces.us.com/
https://www.pandora-jewelrysite.us/
https://www.nikecanadashoesshop.ca/
https://www.jordans23.us/
https://www.nflshoponline.ca/
https://www.nmdr1.us.com/
https://www.wholesaleadidas.us.com/
https://www.jordans14.us/
https://www.jordan17.us/
https://www.foamposites.us.org/
https://www.jordan15.us/
https://www.nikesoutlet.us.org/
https://www.nikeairforce1.us.org/
https://www.pandorajewelrycharmscanada.ca/
https://www.wholesalenikeshoesclothing.us.com/
https://www.retro12.us/
https://www.yeezysboost350v2.us.org/
https://www.nhljerseysstore.ca/
https://www.jordan22.us/
https://www.christianslouboutin.us.org/
https://www.jordan5whatthe.us/
https://www.airmax720.us.org/
https://www.nikerosheblazer.us.org/
https://www.jordan18.us/
https://www.huaraches.us.org/
https://www.lebronsjamesshoes.us.com/
https://www.pandoraa.us/
https://www.nikeairmax270s.us.com/
https://www.nikeairjordan.us.org/
https://www.nhlshops.ca/
https://www.pandorajewelrycz.us/
https://www.jordan35.us/
https://www.airjordans13.us/
https://www.nikerosheblazers.us.com/
https://www.jordans32.us/
https://www.jordan16.us/
https://www.airforce1s.us.org/
https://www.jerseysstore.ca/
https://www.nikess.us.com/
https://www.nikesnew.us.com/
https://www.nikefree.us.org/
https://www.nike-clearance.us.org/
https://www.nikeshoesformens.us.com/
https://www.nikejordan1.us.com/
https://www.pandora-jewelry-charms.us/
https://www.shoeswholesalesuppliers.us/
https://www.newnikesshoes.us.org/
https://www.adidasyeezywebsite.us.org/
https://www.jordan-aj1.us/
https://www.jordan4.us.org/
https://www.adidasoutletstore.us.org/
https://www.canadashoesoutlet.ca/
https://www.nikeshoesdeals.us.com/
https://www.officialpandorajewelry.us/
https://www.nikesbdunk.us.com/
https://www.nikeshoescheap.us.org/
https://www.jordan-12.us.org/
https://www.pandorajewelryofficialsites.us/
https://www.airjordanretro.us.org/
https://www.nikeairhuaraches.us.com/
https://www.jordan24.us/
https://www.nikesneakerss.us.com/
https://www.nikewholesalesuppliers.us.com/
https://www.airjordan33.us/
https://www.yeezyadidas.com.co/
https://www.nikeoutlet-store.us.org/
https://www.michaeljordan-shoes.us/
https://www.jordan11lowretro.us/
https://www.nikeoutletshoes.us.org/
https://www.shoesshop.ca/
https://www.nikeshoeswholesale.us.com/
https://www.wholesalenikeshoesonline.us.com/
https://www.nikecortezshox.us.org/
https://www.nikewomensshoes.us.com/
https://www.nikeairforceones.us.org/
https://www.nikezoomshoes.us.com/
https://www.kidsjordans.us/
https://www.airmaxs.us.org/
https://www.nikeshoesstores.us.com/
https://www.jordans28.us/
https://www.adidasstoreoutlet.us.com/
https://www.jordans34.us/
https://www.cheapjordanswholesalefreeshipping.us/
https://www.newjordans.us.org/
https://www.nikeshoesoutletstoreonlineshopping.us.com/
https://www.jordan11s.us.org/
https://www.airjordan-retros.us/
https://www.cheapshoeswholesalefromchina.us/
https://www.nikefoampositeacghyperdunk.us.com/
https://www.nikeairzoom.us.com/
https://www.newnikesneakers.us.org/
https://www.airjordans11retro.us/
https://www.mlbjerseysshop.ca/
https://www.nikeepicreactuptempo.us.org/
https://www.nike-outlets.us.com/
https://www.officialpandorarings.us/
https://www.nikeoffwhite.us.org/
https://www.nikesoutletstore.us.com/
https://www.toddlerbabyinfantjordans.us/
https://www.jordans12.us/
https://www.nikeslidessandalsslipers.us.com/
https://www.wholesaleshoescheap.us/
https://www.jordan29.us/
https://www.diorjordans.us/
https://www.nikestoresfactory.us.com/
https://www.jordan11concordshoes.us/
https://www.fjallravenkankenbackpack.us.org/
https://www.jordan27.us/
https://www.jordan1.us.org/
https://www.nikerunningshoes.us.org/
https://www.wholesalejerseyscheap.us.org/
https://www.jordans13shoes.us/
https://www.cheapjordansshoessale.us/
https://www.shoesstores.ca/
https://www.jordan20.us/
https://www.nikeair-force1.us.org/
https://www.nikewholesale.us.org/
https://www.nikeblackfridaycybermonday.us.org/
https://www.cheapjerseyswholesale.ca/
https://www.redbottomslouboutinshoes.us.org/
https://www.nikeshoessale.us.org/
https://www.pandorasbracelets.us/
https://www.wholesalejordansfactory.us/
https://www.nikerunningshoesforwomen.us.com/
https://www.jordanshoess.us.org/
https://www.ringspandora.us/
https://www.jordan6s.us/
投稿: Katina | 2022年7月18日 (月) 15時50分
https://www.nikeclearances.us.com/
https://www.nike-rosherun.us.com/
https://www.nikeshoesoutlets.us.com/
https://www.jewelrypandora.us.org/
https://www.pandoracharmsbracelet.us.com/
https://www.pandorascharms.uk.com/
https://www.ultra-boost.us.com/
https://www.nike-onlinecanada.ca/
https://www.nikeoutlet--store.us.com/
https://www.yeezy500boost.us.com/
https://www.adidasoutletshoes.us.com/
https://www.nikesstoreoutlet.us.com/
https://www.offwhite-shoes.us.com/
https://www.adidas-originalssuperstar.us.com/
https://www.yeezyboost350v2.us.com/
https://www.pandoracharmsbracelets.us.com/
https://www.nmdsadidas.us.com/
https://www.nikepresto.us.org/
https://www.adidascom.us.com/
https://www.pandorasjewelry.uk.com/
https://www.officialyeezywebsite.us.com/
https://www.nikeair-force1.us.com/
https://www.nikesoutlets.us.com/
https://www.nikeshoesshop.ca/
https://www.nikeoutletsonline.us.com/
https://www.nikeoutletstore.ca/
https://www.newtrainers.uk.com/
https://www.ultraboost.uk.com/
https://www.shoesoutletstores.ca/
https://www.yeezy350shoes.ca/
https://www.adidassuperstars.us.com/
https://www.adidas-superstars.us.com/
https://www.pandoras.uk.com/
https://www.nike-sneakers.us.com/
https://www.airforce1s.us.com/
https://www.nikesrunningshoes.us.com/
https://www.trainerssale.uk.com/
https://www.adidasshoesonline.us.com/
https://www.nikeoutletstores.us.com/
https://www.yeezyshop.us.com/
https://www.adidass.us.com/
https://www.newadidasshoes.us.com/
https://www.adidasultraboost.shop/
https://www.nmd.uk.com/
https://www.pandorarings.uk.com/
https://www.nikesneakersstore.us.com/
https://pandorabracelets-charms.us.com/
https://www.trainersstore.uk.com/
https://www.yeezyshoesboost.us.com/
https://www.adidasyeezys.us.com/
https://www.yeezycanadastore.ca/
https://www.adidasstoreonline.us.com/
https://www.nikecanada-onlineshopping.ca/
https://www.adidasoutletstores.us.com/
https://www.adidasshoesshop.us.com/
https://www.yeezyshoesadidas.us.com/
https://www.yeezysboost-350.us.com/
https://www.trainersoutlet.uk.com/
https://www.adidasyeezyofficialwebsite.us.com/
https://www.outletadidasshoes.us.com/
https://www.pandorajewelryuk.uk.com/
https://www.nikeclearancestores.us.com/
https://www.nike-outletfactory.us.com/
https://www.yeezyshoesstore.ca/
投稿: Janes | 2022年6月 2日 (木) 10時44分