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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4804閲覧

OpenCVのCAP_PROP_POS_FRAMESで得る画像がずれている。

YoBit

総合スコア3

OpenCV

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/09/04 08:38

OpenCVを使って mpegの動画を読み込んだ後フレームを指定して画像を取得し、いろんなことをやろうとしています。
(開発環境は VisualC++ MFC, OpenCV4.2 Win32版です)

簡単にしたソースが以下なんですが、
得られたimageが 動画ソフト(KeyframeMP2や他のソフト)でフレーム指定して表示した絵と18フレーム程ずれています。

C++

1cv::VideoCapture video; 2video.open("mpeg動画ファイル名"); 3 4video.set(cv::CAP_PROP_POS_FRAMES, 100); 5cv::Mat image; 6video.read(image);

正確にフレームを指定した画像を得る方法がありましたらご教授お願いします。

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

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

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

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

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

t_obara

2020/09/04 11:28

一番最初のフレーム 0を指定した場合はずれていますか?ずれていないとすると、どのフレームからずれていますか?
YoBit

2020/09/04 12:31

Resありがとうございます。 ターゲットとしているのが700フレームだったので、 0フレームからどうずれているか検証してませんでした。 どこからずれはじめているか調査しますので明日位までお待ちください。
YoBit

2020/09/04 13:11 編集

0を指定した場合から18フレームずれてReadされてました。 ずれていたmpegファイルとは違うmpegファイルではズレはなかったです。
guest

回答1

0

ベストアンサー

似たような経験
(動画を開いて先頭から1フレームずつgrabしていく分には問題ないが,フレーム位置を指定するとよくわからんところにすっ飛ばされてしまうという)
がありますが,
古いバージョンのOpenCVのことでしたし,遭遇されている現象に対して役に立つかどうかわかりませんが…

そのときは,「opencv_ffmpeg.dllが実行時に参照できるか否か」によって挙動が変わる様子でしたので,
扱う動画毎に,opencv_ffmpeg.dllを見えるようにしたり見えないようにしたりするという対処を行いました.

今のOpenCVではどうなのかわかりませんが,
その当時のバージョンでは,このdllの有無で動画を扱う手段の切り替えが行われていました.
(VFWかffmpegか,みたいな)

投稿2020/09/05 01:21

fana

総合スコア11658

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

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

YoBit

2020/09/05 13:15

ありがとうございました。
YoBit

2020/09/24 04:49

いろいろあって、OpenCVのバージョンを4.2から 2.4に下げました。 その結果 また、CAP_PROP_POS_FRAMESのずれ問題が出てきました。 V2で”opencv_ffmpeg.dll が見えるようにする” とは具体的にどうやれば見えるようになるでしょうか?
fana

2020/09/24 06:31

「見える」→「見つかる」の方が良かったかな. 要は,dllを探せる場所(パスが通っている場所)にそのdllがあるかどうか,ということです. 例えば,opencv_ffmpeg.dllが他のOpenCV関係のdllと同じ場所にある場合に,それをどこか別のところに(例えばそこに適当なサブディレクトリでもつくってその中に)移動してしまうとか,ファイル名を変えてしまうとかすれば「見えない」状態になりますね.
YoBit

2020/09/24 08:42

ありがとうございました。 4.2では VideoCapture::openの引数にffmpegが選べたので、2.4にもそれに代わるものがあるかと思ってました。  こちらでは正しくframe画像が得られるmpegと得られないmpegがある事が判って、これ以外の動画フォーマットでも問題なく動かす必要がありますので、 上記のような処置は出来そうにありません。 今のところ OpenCVからフレーム画像を得るのはやめて、他の方法(DirectShow/MediaLink等)の検討を始めました。 (OpenCVはバグが多いので少々辟易している感があります)
fana

2020/09/24 09:00

私がこの回答の状況に遭遇した際は,動画から絵を取る部分に関して{OpenCVを用いた実装,別手段を用いた実装}を同じインタフェースクラスからの派生として実装して,アプリケーション上のラジオボタンで切り替えたりとかしてました. (そして最終的に,動画ファイルではなく大量の連番画像群を用いる方向とかに…)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問