« wxpythonとvtkでビデオプレーヤー作ってみる。その4。vtkImageViewerでnumpyアレイ表示。 | トップページ | スクラッチとはこうやるのさ。子犬のDJの技がすごすぎる件。 »

2013年7月 1日 (月)

wxpythonとvtkでビデオプレーヤー作ってみる。その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」カテゴリの記事

コメント

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/

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/

コメントを書く

(ウェブ上には掲載しません)

« wxpythonとvtkでビデオプレーヤー作ってみる。その4。vtkImageViewerでnumpyアレイ表示。 | トップページ | スクラッチとはこうやるのさ。子犬のDJの技がすごすぎる件。 »

しろののツイッタータイムライン(凍結中)

  • ツイッターは5つ目も凍結されました。6つ目での復活も不可能。なのでnoteに注力しています。

    と思ったら、イーロン・マスクの買収が公になってアカウントが復活できました。ありがとうマスク。

    トランプ関連記事の一覧リスト

オススメたち

2022年8月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

はてブ

無料ブログはココログ