主にWebサイト、サーバーサイドプログラムのデザイン・開発を行っております。 https://solarianprogrammer.com/2018/04/21/python-opencv-show-video-tkinter-window/, または、もし再生したい動画が音付きなのであれば、opencvではなくなりますが、こんなのはどうでしょうか。 ※最新記事順 Copyright © 株式会社ライトコード All Rights Reserved. (スライダーの値倍速で再生するプレイヤーとか), もう一つの動機としては,GitHubからディープラーニングのモデルを拾ってきたとき,それを手持ちの動画に適用しようとすると,, と面倒なので,たいてい入っているdemo.py的な動作確認用のサンプル(画像を入れると,認識結果が返ってくる)を内包する動画プレイヤーを作ってみました。 button1.place(x=1100, y=650), f = Font(family='Helvetica', size=11) 部品を生成したら、grid、packメソッドを呼び出す 内容 プログラム プログラムの中身 imagemagickのエラーについて 内容 今回は、PILとMatplotlibを用いて、次のようなGIFアニメーションを作ってみます。 matplotlibのArtistAnimationを使う方法 それぞれ紹介していきます。 プログラム まず、matplotlibのArtistAnimationを使う方法です。グラフをただ表示す … 現在AnacondaにてOpenCVの学習をしております。しかし、動画データをSpyder上で表示しようとしたところ、エラーは何も返ってきてないのにもかかわらず、指定動画が再生表示されません。 使用環境: Anaconda3(Python 2.7.13), Windows 7, OpenCV 3.2.0 試みた内容は下記です。 1, 【募集】 特に事情がなければクリックして制限を外しておきます。, こちらも公式サイトよりダウンロードできます。 Python(パイソン)では、非同期プログラムを作成する場合、一般的に、Threadクラスを使って「マルチスレッド」にします。, 今回は、「非同期プログラムで、マルチスレッドが思ったように動かない場合」と、「その対処方法」について、ご紹介したいと思います!, 言語によっては面倒なマルチスレッドも、Python では非常に簡単に実現できます。, 例えば、「メインスレッドで a ~ g」、「サブスレッドで 1 ~ 7」を出力する場合、以下のようなコードになります。, Threadクラスの、コンストラクタの引数に、先程の関数 sub_thread を渡します。, 非同期で実行しているので、「a ~ f」と「1 ~ 7」が、適当に混ざって出力されています。, このコードを動かすには、ソースをおいたフォルダ直下に「videoフォルダ」を作成。, そこに、動画ファイル「video.mp4」を置いてください。(動画の内容は問いません), 動画の画像取得に「cv2 モジュール(OpenCV)」、GUI操作には「wx モジュール(wxPython)」を使っています。, 動画再生用に、簡単なクラス「VideoBitmap」を作成し、それの実行メソッド run() を、サブスレッドとして実行しています。, VideoBitmap は、「wxPython」の「StaticBitmap」を継承しています。, 動画からの画像取得は、 create_wx_bitmap_from_cv2_image() メソッドで行っています。, 1、OpenCV でフレームを読み込み 2、それをこのメソッドで画像に変換 3、自身にセットして描画する, こういう時は、その「クラスがマルチスレッドに対応しているか」どうかを疑ってみましょう。, 今回は、wxPython の StaticBitmap を継承して、動画再生クラスを作りました。, しかし、そもそも wxPython の StaticBitmap クラスが、マルチスレッドに対応しているかどうか分かりません。, (wxPython のドキュメントを見ても、対応しているかどうか明記されておりません。), 今回の事象は、使用しているクラスが、「マルチスレッドに対応していないことが原因」である可能性が高いと考えられます。, つまり、例えば「Windows10 では動作しても、Linux や Mac では動作しない」といった事象も、あり得るということです。, マルチスレッドでクラスを使う場合は、それが(対象プラットフォームで)マルチスレッド対応しているかどうか、をチェックする必要があります。, マルチスレッドが正しく動かないのなら、「シングルスレッド」で処理します。つまり、メインスレッドだけで処理を行うしかありません。, ですが、これは見方を変えれば、スレッドを切り替えながら実行しているということです。, ということは、シングルスレッドでも、処理の流れを切り替えながら並行して実行できれば、擬似的にマルチスレッドを実現できるわけです。, timer  は、指定した間隔でタイマー割り込みをかけ、現在処理中の箇所から、timer イベントに処理を切り替えるものです。, interval  は、timer イベントの発生間隔を示すもので、フレームの再生レートをセットしています。, timer インスタンスが、timer イベントを制御する本体で、これを使うと、timer イベント(EVT_TIMER)を発生させることができます。, 最後の、 Bind() メソッドは、イベントとメソッドを紐付ける(Bind する)ために、実行しています。, timer イベントで呼ばれる、 on_timer() メソッド内では、動画を1フレーム読み込み、それを bitmap に変換して自身にセットしています。, この timer イベントを使うと、擬似的にマルチスレッド的な処理を行うことができます。, 動画だったので、画像を入れても伝わらないので入れるかどうか迷いましたが…。分かりにくい画像で申し訳ありません(笑), 今回は、Pythonにおいて「マルチスレッドが思ったように動作しない時の原因」と、「その回避方法」をご紹介しました!, 通常は、3つ以上のスレッドが行き交うような複雑なスレッド処理でなく、2つのスレッドを並行処理する場合が大半です。, そうした場合に、思ったようなスレッディングができない場合は、利用しているクラスが「マルチスレッド非対応」である可能性を疑いましょう。, そして、それを回避するためには timer イベントを利用した、疑似並行処理が有効です。, (株)ライトコードは、WEB・アプリ・ゲーム開発に強い、ITが大好きな会社です。 Pythonでのシステム開発依頼・お見積もりはこちらまでお願いします。 また、Pythonが得意なエンジニアを積極採用中です!詳しくはこちらをご覧ください。, 当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。, また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!, なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。, 私たちライトコードでは、エンジニアを募集しております。 私服大歓迎のカジュアルな職場なので、お気軽にご応募ください! また、フリーエンジニアの方も募集しております。, 【福岡オフィス】〒812-0011 福岡県福岡市博多区博多駅前3-13-4 リアンプレミアム博多駅前ビル3F 【東京オフィス】〒101-0051 東京都千代田区神田神保町2-32 神保町フロント5F. frame1.rowconfigure(1, weight=1) frame1.grid(sticky=(N,W,S,E)), button1 = ttk.Button(frame1, text='OK', command=button_click) 例えば、pushedという関数を作り、クリックするとprint関数で「clicked」と表示するものとしましょう。, では、クリックしたときにメッセージを変えてみます。これをpushed関数に取り込んでみましょう。 Tkinterでは、各部品を表示した後は、最後に追加した部品でmainloopメソッドを実行することが定められています。 動画再生用に、簡単なクラス「VideoBitmap」を作成し、それの実行メソッド run を、サブスレッドとして実行しています。 Does the bus.connect require a window_id? teratailを一緒に作りたいエンジニア, # b = self.ls.remove(os.path.basename(__file__)), # ※7 listdirではファイルの取得順序は保証されていない!のでソート処理を追加, # ※10 time.perf_counter()で計測すると_setting内の処理時間が30fpsを余裕でオーバーしている. 前者同様、3.8.5をインストールします。, 64ビット版: https://www.python.org/ftp/python/3.8.5/python-3.8.5-macosx10.9.pkg 32ビット版: https://www.python.org/ftp/python/3.8.5/python-3.8.5.exe. https://videos.pexels.com/videos/cat-playing-with-tape-1358988 https://videos.pexels.com/videos/man-walking-the-dog-at-the-street-992590, PythonのGUI Toolkitはkivy以外にもいろいろ(PyQt, Tkinter等)ありますが,kivyは下記を満たすので使いやすいです。, 非公式ですが,日本語に翻訳されたドキュメントがあります。 #!/usr/bin/python3 動画の画像取得に「cv2 モジュール(OpenCV)」、GUI操作には「wx モジュール(wxPython)」を使っています。 動画再生. from tkinter.font import Font (株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました! ※作成日が新しい順に並べ... 「非同期プログラムで、マルチスレッドが思ったように動かない場合」と、「その対処方法」, Julia入門~高速な動的型付け言語~【Jupyter Notebookを使ったグラフ描画編】. Why not register and get more from Qiita? './src/img/0/' Why not register and get more from Qiita? https://pyky.github.io/kivy-doc-ja/guide/lang.html, 下記の記事,そしてこれを執筆したお二方の他の記事は,kivyのkの字もわからなかったときに非常に参考になりました。, kivyでアプリを作る際は,中身の処理を記述する.pyファイルと,アプリ画面のレイアウトを記述する.kvファイルの2つを作成する必要があります。1 Tkinterは他にも使えることがたくさんあるので、調べてみてください。, まずはじめに、tk.Tk()でメインウィンドウをつくる './src/img/3/', この格納された画像PATHごとにViewerを作り、4つのViewerで30fpsの動画再生を同時に行う。, teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。, 評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。, 上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。, Windowを分けたいという要望なため、TopLevelWindowを使用して改造。, ※10のコメントの箇所は改善するとしたらThreadPoolExecutorを使用するという形になると思うので、興味があるならぐぐってみてくださいな。 PythonとOpenCVを使って画像・動画の読み込み・表示方法・動画像のプロパティの取得までご紹介します。また動画像の読み込みは、WEBカメラからの読み込みやってみました。最近、ラズベリーパイなどで監視カメラ等を作成する際に、WEBカメラを使用すると思います。 Help us understand the problem. ここでは安定版の3.8.5をインストールします。, 64ビット版: https://www.python.org/ftp/python/3.8.5/python-3.8.5-amd64.exe 申し訳ないのですが、途中でモチベーションが下がってしまったので、 Contribute to Sakaki/pyniconico development by creating an account on GitHub. scrollbar.place(x=1200, y=60,height=525), canvas = tkinter.Canvas(root, width = 800, height = 450)#Canvasの作成, canvas.create_imageに動画データを入れようとしましたがうまくできませんでした。, teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。, 評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。, 上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。, 質問のコード、「第三者として」読んでみてください。 root変数に対して、titleメソッドを呼び出すと、タイトルが変えられるというわけです。 You could use python-gestreamer for playing (this works for me on Linux, but it should also work on windows). まあ、本当はチェックボックス設けないで自動的にパス通してほしいのですが... 途中インストールを進めているとオプション機能をインストールするか尋ねられます。 Could it be made to work with a frame, or a label. この格納された画像PATHごとにViewerを作り、4つのViewerで30fpsの動画再生を同時に行う。 発生している問題・エラーメッセージ 一つの画像Viewerでは動画再生ができたものの複数 Window を作り 同時再生するためにはどのようにすべきかわからない。 下記それぞれのPATHに30fpsの画像(YYYYMMDD_HHMMSS.mmm.jpg ...)が1000枚ずつ格納されている。 読みやすいですか? でも、毎回 tkinter.・・・とするのは面倒なので、tkという名前で使えるようにしたいなら, Tkinterでは、ボタンなどをウィジェットと呼んでいます。 (The sound channels are simply mixed together.). 読みやすいようにしてください。 I want to display video 'thumbnails'. ニコニコ動画のダウンロードやマイリスト取得が行えるPython製のツールです。. @koehima プログラムの最後には、最後に作った部品に対してmainloopメソッドを呼び出すようにする, 毎日がマイペース。写真、プログラ厶大好き。 GUIソフトを起動して映像部分を消して音声ファイルで書き出しよりFFmpegなら少ない手順でできます。 動画からmp3形式で音声ファイルを生成する. command=txt.yview) これは Python 3 がインストールされている環境であれば、Tkinter を利用して作成した GUI アプリを動作させることもできるということにもなります。 したがって、あなたが作成したプログラムをより多くの方の環境で利用してもらうこともできます。 LinuxもGPUも不要です。Windowsのノーパソが1台あればOK。, 「スライダーの値がある変数に代入されて,ボタンを押すとある関数が実行される動画プレイヤー」を一度作っておけば,関数部分を書き換えるだけでいろんな機能を持った動画プレイヤーが作れそうなので,作ってみました。 162016-05-25 10:49:30 HendrikFrans. 試しに「Hello,World」と表示してみましょう。, 最後にroot.mainloop()と書いてある場合は消してから追加してください。 0, 回答 python側のAppクラス名("DeepPlayerApp"のAppの前まで)とkivy側のファイル名(deepplayer.kv)が対応していないとダメなので注意してください。2, kivyにはFileChooserというモジュールがあるので,そのまま使えば良いです。, kivyにはVideoPlayerという動画再生用のモジュールがあるため,この変数であるsourceに動画のパスを渡せば良いです。, の2つがありますが,今回は前者を使いました。後者の実装だとこちらのようになります。, カメラの映像をリアルタイムで物体検出するようなデモは学会やイベントでもよく見ます。今回は動画プレイヤーを作るので,リアルタイムではなく,いったん動画全体の物体検出を行うような実装にします。 Is there a way to play video files like AVI, MP4, etc.? python Licensed under cc by-sa 3.0 with attribution required. ここで、lambdaというのが出ますが、これはPythonでコールバックなどを指定するときに役立つ無名関数というものです。 ウィンドウサイズを変えるには、geometryメソッドで変更できます。 今IoTで注目されている、手のひらサイズのコンピューター「Raspberry Pi(通称RPi、ラズパイ)」が人気を浴びています。 – erjoalgo 25 8月. p.wait()を挟むことで,推論の処理中はGUIに触れないようになっています。, 2つ目はinit_deep()で,ディープラーニングの前処理を想定した関数です。中では動画をスライダーで指定したfpsごとに画像化して./tmp/imgに格納する処理を行っています。, 3つ目はdel_deep()で,ディープラーニングの後処理を想定した関数です。今回は無くても良いのですが,中でClock.schedule_interval(self.update, self.df_dl/self.fps)を呼ぶ役割を持たせました。以後,一定間隔ごとにupdate()が呼ばれます。, 4つ目は,上で一定間隔ごとに呼ぶことにしたupdate()関数です。 例えば、timeというライブラリをインポートするにはimport timeとします。 Python を学びながら GUI アプリが作成できる . 285行目から304行目を下記のように書き換えます。, 3fps (frames per second)で物体検出を行った結果です。 Note that you need the package gstreamer1.0-libav in addition to gstreamer1.0-plugins-*. './src/img/2/' root.title(u"TkinterのCanvasを使ってみる") txt['yscrollcommand'] = scrollbar.set Would it be possible to play multiple videos on the same window? I tried using PyMedia, but apparently it only works with Pygame. PythonでTkinterを使ってめちゃくちゃ簡単にGUIアプリを作る 「動画選択」ボタンクリック時の処理(push_load_button) 「動画選択」ボタンクリックイベントが発生した際には Contoller クラスのオブジェクトは主に下記の処理を実行します。 pushed関数ではそれをbという変数として受け取っています。, 大体、PythonとTkinterに慣れたでしょうか? 'python detect.py --images ../../tmp/img --det ../../tmp/csv', https://videos.pexels.com/videos/cat-playing-with-tape-1358988, https://videos.pexels.com/videos/man-walking-the-dog-at-the-street-992590, https://pyky.github.io/kivy-doc-ja/guide/lang.html, https://qiita.com/dario_okazaki/items/7892b24fcfa787faface, https://qiita.com/gotta_dive_into_python/items/4180a6601502486918d7, https://github.com/ayooshkathuria/pytorch-yolo-v3, 動画のパスをpython側で変数として持ち,kivy側で必要なときはそこを参照する, 動画のパスをkivy側で変数として持ち,python側で必要なときはそこを参照する, you can read useful information later efficiently. (動画に物体検出を適用したいだけであれば,yoloならもともと動画を入力するデモもついています), demo.pyの入出力仕様も実装によって多少異なりますが,下記のような仕様を想定します。, 上記のリポジトリではdetect.pyがdemo.pyに相当するプログラムですが,上記の仕様を満たしていない(画像を入力すると,矩形が描画された画像が出力される)ので,csvを出力するように何行か書き直します。 Python 学習初心者の方で、GUIアプリケーションを作る時にオススメのライブラリ4つをご紹介しています。今回は、Kivy、Tkinter、PyQt、wxPythonをご紹介していますが、PythonでGUIライブラリには、それぞれ特徴があるので注意が必要です。 Mac OS Xでは32ビット版はありません。, macOSのインストーラでは自動的にTkinterがインストールされますので特段操作は必要ありません。 再生中の動画に何が写っているか検出する機能も付けました。 この記事は,ドコモアドベントカレンダー8日目の記事になります。 Pythonでアプリを作成できるライブラリのkivyを使って,動画プレイヤーを作ります。 再生中の動画に何が写っているか検出する機能も付けました。 LinuxもGPUも不要です。Windowsのノーパソが1台あればOK。 1 / クリップ What is going on with this article? 現在はQtなどが主流ですが、Tkinterはコードを難しくすることなくできるので、日経Linuxなどでも取り上げられています。, まず、TkinterはPythonで動くので、まだインストールしていない場合はインストールします。, WSLを使う手もありますが、TkinterはGUIを扱うものですのでネイティブ環境で実行します。 root.rowconfigure(0, weight=1), frame1 = ttk.Frame(root, padding=10) txt.see('end'), root = tkinter.Tk() この関数が呼ばれるたびに,各フレームの物体検出結果を参照し,, を行っています。これをfpsの逆数の間隔で呼ぶことで,指定したfpsで物体検出の結果が動画に重ねて描画されます。, 注意点として,多くのライブラリでは画像の左上の座標を(0,0)とするのに対し,kivyでは画面の左下の座標が(0,0)であるため,y座標の反転が必要です。 Help us understand the problem. import tkinter Pythonで書いたプログラムを実行して使う場合、『GUIで入出力できたら便利なのに…』と思うときはありませんか? 誰かにプログラムを配布する場合でも、CUI(コマンドラインから入出力)はあまり親切とは言えません。 0, python tkinter canvas 画面のズーム・移動後のマウス座標について, 回答 過去にも紹介されてきている、簡単なGUIをわずかなコードで作れるライブラリをご紹介します。, 簡単に扱えるものの中に「Tkinter」というライブラリがあります。 import sys 再生中の動画に対して物体検出を行い,結果を表示できることを確認できました。, 推論だけとはいえど,CPUだとそこそこ時間がかかるので,物体検出を行うfpsを指定するためのスライダーを左下に追加しました。 これがないと、ボタンなどが正しく表示されない、描画されない、イベントが処理されないといったバグの原因になります。 1 / クリップ Pythonでアプリを作成できるライブラリのkivyを使って,動画プレイヤーを作ります。 実行すると、左上に「Hello,World」と表示されるはずです。, windowにはラベルを表示させたいウィンドウの変数を、param1=valueの部分には色々なパラメーターを指定します。 前提・実現したいことtkinterで作ったGUI上で動画を再生したいと考えています。 発生している問題・エラーメッセージcv2.imshowはtkinterで使えないようで、canvas上で動画が再生されればよいと思ったのですが、その処理がうまくわかりません。また、再生・一時停止・クリック時の時間 そのため、Tk()メソッドで新しくウィンドウを作ります。, とりあえずこれを書いた状態で実行してみましょう。これはtk.pyとして保存した場合です。, root変数で、Tkメソッドで作ったウィンドウが操作できるようになります。 (自分のPCだと推論に0.8秒/枚ほどかかったので,3fpsだと動画長の2.4倍くらいかかります), ここがただの動画プレイヤーとの差分で,内包するモデルによって多少書き換えが必要になりうる部分です。, kivy側ではただボタンを追加するだけです。クリック時にpython側の関数clicked_deep()を呼ぶように紐づけます。, 1つ目はclicked_deep()で,ボタンが押されたときにまず呼ばれる関数です。中では,, の4つを行っています。