質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5254閲覧

【Python】Aviutlみたいに容量の大きい動画でも、スライダー操作でサクサク画像を表示できるようにしたい

otakoma

総合スコア19

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2グッド

5クリップ

投稿2018/08/07 05:59

前提・実現したいこと

Pythonでテニスの動画解析ツールをつくっています。

↓の画面のように、GUIでスライダーがあり、スライダーを移動することで動画のフレームが移動し、そのフレームの画像が表示されるというものになっています。

イメージ説明

フレーム数が長い動画を扱う場合、メモリが足りなくなるので、動画を細かく分けて扱っています。

できれば1つの動画として扱えるようにしたく、うまいやり方がないか模索中で、ご意見をいただきたいです。

同じ動画を扱うにしても、
フリーソフトのAviutlなどはこういった操作もサクサク動くので、ああいう感じでやりたいなあと思っています。

困っていること

①前処理として動画の画像情報をフレーム毎に配列に格納する処理をしています。
②動画解析時にスライダーを移動させると、スライダーの数字に合わせて配列を読みにいってその画像を表示する
ということをやっています。

↓は①のソースコードで、リサイズしてからimageArrayという配列に格納してます。
フレーム数が大きいとメモリが足りなくなるので、start=88000、end=98000と範囲を絞っております。

①のソースコード

python

1# 動画ファイル(avi mp4)を読み込んで、各フレームをArrayファイルに格納する 2import cv2 3import sys 4import numpy as np 5 6w, h = 360, 640 7 8start = 88000 9end = 98000 10 11imageArray = [] 12fileName = 'test.avi' 13video = cv2.VideoCapture(fileName) 14if not video.isOpened(): 15 print("Could not open video") 16 sys.exit() 17ok, frame = video.read() 18if not ok: 19 print('Cannot read video file') 20 sys.exit() 21 22for i in range(0, end): 23 ok, frame = video.read() 24 if(start <= i): 25 if(ok): 26 img_resize = cv2.resize(frame, (h, w)) 27 imageArray.append(img_resize) 28 29video.release() 30cv2.destroyAllWindows()

試したこと

動画を連番で画像ファイル(jpeg)などで全て保存してから、フレーム毎に画像ファイルを読み込みにいく、というやり方を試してみました。

しかし、画像ファイルを新たにつくることになるので容量が余計に増える、すべて保存するまでに時間を要する、などの課題がありまして、もっとよいやり方がないかなと思っております。

どうか宜しくお願いします。

補足情報(FW/ツールのバージョンなど)

参考ですが、Qiitaにこの動画解析ツールの記事を投稿してます。
Pythonでテニスの動画解析ツールを自作してみた

Ryupe, tachikoma👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

動画の最初から表示位置まですべて読み出しているように見えます。
必要な部分だけ読むようにしないと無駄に時間がかかります。
お使いのライブラリでそのような仕組みが用意されているかは知りませんが、seekとかありませんか?

中の話をすると、動画というものはI,P,Bの3種類のフレームからできており、単独で読めるのはIフレームのみなので、まずIを探しP,Bと差分を足す形になります。
そのへんも考慮してシークするとより速いでしょう。大抵の動画プレイヤーはIフレームへしかシークできません。

投稿2018/08/09 01:14

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otakoma

2018/08/10 15:37 編集

ありがとうございます。PythonのOpenCVを使用していますが、video.setでシーク(フレーム位置を指定)することができそうです。 I,P,Bですが、なるほど、動画の圧縮方法をうまく利用することで効率的にシークすることができるんですね。勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問