こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

映像をコマにわけるプログラム

フリーソフトなどを使うのではなく、映像を読み込んで、その映像をコマにわけるプログラムをどう作ればいいか教えてください。こういった関連のソースがあるサイトなどもあれば教えてください。

投稿日時 - 2009-09-02 16:57:15

QNo.5257147

困ってます

質問者が選んだベストアンサー

おめでとうございます.うまくいって良かったです.

> 以前教えていただいたサイトのソースにcvSaveImage( "hogehoge.jpg", src );を加えて実行したところフレーム画像が出力されました。しかし、for文に含まれているのに1枚しか出力されませんでした。どうしてでしょう?

今のままですと,常に最新のフレームでファイルが上書きされてしまいます.
すべて別ファイルにしたいならば,以下の様に,1フレームごとに
cvSaveImageに与えるファイル名文字列を作り直す様にしましょう.
(バグチェックしてないので,何かエラーがでたらすみません)

----------------------------------------------------------------

int main(){
int fileCount; // この行を加えてください
char fileName[1024]; // この行を加えてください



//処理ループの開始
for(fileCount = 1;;fileCount++){ // この行をこのように書き換えてください



//画像保存
sprintf(fileName,"hogehoge%05d.jpg",fileCount); // この行を加えてください
cvSaveImage(fileName, src); // この行をこのように書き換えてください



----------------------------------------------------------------

こういう処理のカスタマイズは,いろいろと自分で試行錯誤してみると覚えが早くなりますよ.

投稿日時 - 2009-09-11 16:45:34

お礼

 ありがとうございました。できました。
 最後にこういったプログラムを勉強できるサイトなどありましたら教えてください。

投稿日時 - 2009-09-14 17:24:59

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

> 最後にこういったプログラムを勉強できるサイトなどありましたら教えてください。

難しい質問ですね。
やること(画像処理、音声処理、GUI、ゲーム、通信、etc)や環境(Windows、Linux、Mac、組み込み)によっていろいろなサイトがあります。
その都度探してみるしかないです。

私がよく参照する、基本に近いものをいくつか紹介します。

・C言語関係

C言語の関数リファレンスなら「BohYoh.com【C言語講座】標準ライブラリ関数」
http://www.bohyoh.com/CandCPP/C/Library/index.html

簡単なC言語の関数リファレンス・ソース例ならば「初心者のためのポイント学習C言語」
http://www9.plala.or.jp/sgwr-t/

ウィンドウズよりのC言語基本は「猫でもわかるプログラミング」
http://homepage2.nifty.com/c_lang/

・OpenCV関係

OpenCVの基礎の確認・関数リファレンス・ソース例は「http://opencv.jp/
http://opencv.jp/

OpenCVのちょっと凝ったひな形を見るなら「OpenCV@Chihara-Lab.」
http://chihara.naist.jp/opencv/?FrontPage

以上です。

投稿日時 - 2009-09-16 22:06:52

ANo.3

ニコンのカメラの動画なんですね。
おそらく、それですとAVIファイルといっても、実態はMotion JPEG形式なのだと思います。
http://ja.wikipedia.org/wiki/Motion_JPEG

TMPEGEncで読み込む方法としては、環境設定のVFAPIプラグインタブで、
DirectShow Multimedia File Readerだけを残して、後のチェックをはずすか、
これの優先度を上げてください(こうしないと、ソフトウェア側で普通のAVIファイルだと
思って頑張って読んでも読めない、ということになってしまいます。ほかのaviutl等の
ソフトでも、たぶん同じ現象が起きています)
(※Motion JPEG形式ファイルが手元にないので未検証)
こうすることによって無圧縮AVI形式に変換でき、OpenCVで読み込めるはずです。



蛇足)
原点(デジカメ動画をコマ画像に分けたい)に立ち返ってみると...元ファイルの実態は
中でJPEG画像が並んでいるだけなので「Motion JPEGのままでファイル開く→一定長(可変?)
を読んで(ヘッダーをつけて)書き出す→以下繰り返し」などは出来ないのでしょうか。

また、SourceForgeにそれっぽいのがGPL(ソース付き)であがっていました。
これを参考にするか、そのまま関数を利用させてもらっても良いかもしれませんね。

・Almara Photo Editor
http://sourceforge.net/projects/almara/
almara-0.9.0.tar.gzに一式入っています。実際必要なのはmjpeg-jpegsフォルダ内のソースです。

・mjpeg-jpegs
「mjpeg-jpegs is a tool for coverting Motion-JPEG files
such as the short movies produced by digital cameras
to JPEG files and back. Both AVI and QuickTime
formats are supported, including audio tracks.」

投稿日時 - 2009-09-09 19:51:16

お礼

 ありがとうございます。読み込むことでできました!
 以前教えていただいたサイトのソースにcvSaveImage( "hogehoge.jpg", src );を加えて実行したところフレーム画像が出力されました。しかし、for文に含まれているのに1枚しか出力されませんでした。どうしてでしょう?
 「Motion JPEGのままでファイル開く→一定長(可変?)を読んで(ヘッダーをつけて)書き出す→以下繰り返し」も試してみたいと思います。

投稿日時 - 2009-09-11 13:46:38

ANo.2

とりあえず、ファイルの場所の勘違いやファイルパスに使用している文字の問題では無いと仮定します。

一番簡単な方法は、映像ファイルを無圧縮avi形式に変換することでしょう。
下記のページに従って、TMPGEncのファイル出力機能でお使いのファイルを変換し直してください。
映像コーデックの選択は無圧縮24ビットRGBです。
http://www.xucker.jpn.org/pc/tmpgenc_wmv2avi.html
(ただし、変換にかなりの時間がかかること、ファイルサイズがかなり大きくなることに注意してください)

また、私の環境ですと、完全な無圧縮以外にも、ちょっと古めのCinepak CodecもOpenCVで読み込めました
(TMPGEncでは「Cinepak Codec by Radius」)。
そのほかにも、Windowsデフォルトで読めるaviコーデックのファイルならば読めるかもしれません(未確認)。


最近の高圧縮コーデックファイルを読み込むためにはDirectShow(およびDirectShow編集サービス)の機能を使う必要がありそうです。
ただし、OpenCVと比較しても煩雑です。

「C++ および Visual Basic アプリケーション開発者のためのオーディオおよびビデオ テクノロジ」
http://msdn.microsoft.com/ja-jp/library/dd148664.aspx

「DirectShow 編集サービスの使い方」
http://msdn.microsoft.com/ja-jp/library/cc371134.aspx

投稿日時 - 2009-09-06 03:49:54

お礼

 ありがとうございます。TMPGEncを使ってデジカメの動画を無圧縮にしようと実行してみたのですができませんでした。無圧縮にしたい動画はaviファイルで、デジカメはNiconの「COOLPIX S510」です。
 また、フリーソフトのaviutlも使ってみたのですが「ファイルの読み込みに失敗しました。このファイルの形式には対応していないか、対応するこーデックやプラグインが登録されていない可能性があります。」とでました。 
 デジカメの映像を使おうとするとうまくいかないのはなぜなんでしょう?

投稿日時 - 2009-09-09 11:38:29

ANo.1

OpenCV(とC言語)を使用するのがよいでしょう.
http://chihara.aist-nara.ac.jp/opencv/

このサイトのサンプルプログラム「LoadVideo.cpp」では,AVIファイルを読み込んでフレーム画像を取り出し,表示する,を繰り返しています.
この表示部分「cvShowImage("Source Image", src);」をOpenCVで用意されている「cvSaveImage( "hogehoge.jpg", src );」に置き換えればよいでしょう.
http://chihara.naist.jp/opencv/?%C6%B0%B2%E8%A5%D5%A5%A1%A5%A4%A5%EB%A1%CAavi%A5%D5%A5%A1%A5%A4%A5%EB%A1%CB%A4%CE%C6%C9%A4%DF%B9%FE%A4%DF

投稿日時 - 2009-09-02 19:36:07

お礼

回答ありがとうございました。さっそくプログラムを実行してみたのですがデジカメで撮影した動画は”指定のaviファイルが見つかりませんでした.”と出力され、読み込めませんでした。これは、コーデックが特殊だからでしょうか?この問題をどう解消したらよいのでしょうか。
 また、読み込むことのできるaviファイルはどういったものかを教えてください。お願いします!

投稿日時 - 2009-09-04 14:17:07

あなたにオススメの質問