
現在WindowsのVC++で動画ファイル(.avi)に画像処理を行いたいと思っています。
もう少し具体的に述べますと、.aviファイルを読み込み、その映像にエッジ抽出や差分画像抽出などの画像処理を施して、画像処理された新たな.aviファイルを出力するというものです。
しかし、1から画像処理プログラミングを行うほどの知識もなく、どうすれば…と思っていたところ、OpenCVなど画像処理ライブラリというものがあることを知りました。
それを用いて.bmpなどの静止画像のエッジを取ったりというような処理はなんとなくわかったのですが、.aviファイルなどの動画ファイルに対する画像処理の方法がよくわからないのです。
動画というものは静止画の集合なので、動画像処理は静止画像処理を連続的に行えばよいと耳にしたのですが、これは正しいのでしょうか?
もし正しいのであれば、.avi動画ファイルにたいして連続的な静止画処理を行い、また.aviファイルを出力するということはOpenCVを用いてできるのでしょうか?
また、そういったことが詳しく解説されている書籍や日本語サイトなどがあれば教えていただけませんでしょうか。
素人の質問ではありますが、皆様どうぞよろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
>上記のプログラムのどの部分を変更してVC++にコピーして実行すれば動くものなのでしょうか?
とりあえずOpenCVをダウンロードしてビルドしなければいけません。それでビルドが通ると"なんとか.lib"や"なんとか.dll"が生成されて、それをリンクして自分のプログラムを書く形になります。VCの人のためにビルド用プロジェクトが用意してあるのですが、私の環境(VC6)では一発でコンパイル通りませんでしたので、いろいろコメントアウトしながらだましだましやりました。とてもめんどくさいです。
下のソースの場合はhighgui.libとcvcam.libを同じフォルダにコピーしてきます。あとは”なんとか.dll”が無いよと言われるので、それも探してきて配置します。
>size.width = ***;
>size.height = ***;
に入力データのピクセルサイズを入れてやります。
>(double)***, // fps指定
のところは 30.0 とか書いとけばとりあえずOK.
ところで下のソース、致命的な欠点がありました。ファイル読み書きと再生はできるのですが、まともに画像処理ができませんでした。
imageの中にフレームのメタデータは入ってくるのですが、実画像データが入ってこないです(入れる場所はあるんだけどNULLになってる)。
なので試しにこれをOpenCVで画像変換しようとするとエラーになり、いまのところお手上げ系です。ビデオメモリの中にバッファを確保してる系かもしれません。
VFWはVCのデフォルト状態で
#include "vfw.h"
#pragma comment (lib, "vfw32.lib")
とするだけでいいので導入がすごく楽です。
あと、システムメモリ上にビットマップデータがちゃんと入ってきますので、あとはそれをOpenCV互換な形(IplImage構造体)に直してやります。
>動画処理やOpenCVに関するサイトや書籍
昨日見つけたんですがここ
http://chihara.naist.jp/people/2004/kenta-t/Open …
ご回答ありがとうございます。
OpenCVだけでの処理はどうやら難しいようですね。
とにかくVFWなどを導入してみて、画像処理が出来るところまでやってみたいと思います。
No.5
- 回答日時:
>補足して質問なのですが、このエンコードの種類を調べるにはどうすればよいのでしょうか?
もしaviファイルがお手元にあるのなら使われている圧縮形式を調べる方法は簡単です。
http://kurohane.net/seisanbutu.phtml
にある [真空波動研] で調べることができるはずです。
>また、デコーダのインストールをすることで、aviファイルのRGB値を取得する準備ができるとのことですが、デコーダをインストールすればプログラム内では特にデコードは気にする必要はないのでしょうか?
>それともプログラム内にデコードするための部分などが必要なのでしょうか?
私が経験あるのはDirect Showを用いた手法ですので直接参考にはならないと思いますが
Direct Showではデコーダ(Codec)さえインストールされていれば
メモリに自動的にテクスチャデータ(RGB値の入ったデータ群)として作ってくれます。
あとはそいつをどのように加工するのもユーザの自由ですので。
DirectShowですか~。
VFWやOpenCV以外にもたくさんのAPIがあるのですね。
いろいろと試して自分に合うものを見つけてみたいと思います。
No.3
- 回答日時:
■OpenCVの調査結果
OpenCVはいけてる系でした。VFWもラップされてるようです。
読み書きしながら再生するのはこんな感じでできました。
//
// test.cpp
//
#include "highgui.h"
#include "cvcam.h"
#pragma comment (lib, "highgui.lib")
#pragma comment (lib, "cvcam.lib")
CvVideoWriter* writer;
void mycallback(IplImage* image)
{
/*
imageに対してなんか処理
*/
::cvWriteFrame( writer, image );
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
CvSize size;
size.width = ***;
size.height = ***;
writer = :cvCreateVideoWriter("C:\\***out.avi",
-1, // 出力コーデックをダイアログで選ばせる系
(double)***, // fps指定
size, // サイズ
1 // カラーで
);
::cvcamPlayAVI("***.avi",
::GetDesktopWindow,
::GetSystemMetrics(SM_CXSCREEN),
::GetSystemMetrics(SM_CYSCREEN),
mycallback);
::cvReleaseVideoWriter(&writer);
return 0;
}
ひょっとしたらCinepackとかキーフレーム入れて差分をとる系のコーデックだと、これではうまくいかないかもしれません。(VFWのときは何これっていうかんじのDIBしかとれませんでした。)
そのときはメモリ上にバックバッファを用意して、そこにカリカリ描画して、それを値コピーしてきたものに処理かけていくほうがいいかも。
saitohaさん、またまたありがとうございます。
わざわざプログラムまで書いていただいて申し訳ありません。
せっかく貴重なご回答を頂いたにもかかわらず、私の勉強不足であまり理解できませんでした・・・申し訳ございません。
上記のプログラムのどの部分を変更してVC++にコピーして実行すれば動くものなのでしょうか?
ぱっと見た目、C:\\***out.aviなどの部分は私のaviファイルの場所に設定しなおせば良いということはわかりますが、その他書き換えると良い部分もよろしければ教えていただけませんでしょうか?
>■OpenCVの調査結果
>OpenCVはいけてる系でした。VFWもラップされてるようです。
とのことですが、私のような初心者でも理解しやすいような動画処理やOpenCVに関するサイトや書籍がございましたら教えていただけませんでしょうか?
saitohaさんからいただいた貴重なご回答が理解できるように、勉強したいと思っております。
初心者のような質問でまことに申し訳ございませんが、よろしくお願いいたします。
No.2
- 回答日時:
いろいろなやりかたがあるかもしれませんが、私が以前AVI再生エンジンに使ったのはVFH(Video for Windows)系APIでした。
VC6ではデフォルト状態でついてくる系だし、MSDNにもAPIの説明がある系です。
一枚一枚のビットマップをDIBで取得することができます。
だから、入出力はVFHで、処理はOpenCVとかでやるというのはどうでしょう。
(最近はMISTっていうのも気になっていますが落としっぱなしでまだ使ってません。どうなんでしょう?)
古いAPIだから描画とかが遅いのではないかと心配でしたが、意外といいかんじでしたよ。
saitohaさん、ご回答ありがとうございます。
Video for Windows APIというものもあるんですね~。
VFWと検索すると結構詳しいサイトもありますね。
う~ん、難しそうですが検討してみますね~。
私の予想ではOpenCVがaviの入出力から画像処理までなんでもやってくれるのかと思っていたのですが…どうやら難しいようですね。
No.1
- 回答日時:
私はOpenCVを使ったことがないので分かる所だけ説明します。
>動画というものは静止画の集合なので、動画像処理は静止画像処理を連続的に行えばよいと耳にしたのですが、これは正しいのでしょうか?
基本的にはあっていますが、少し補足説明
プログラムで画像処理を行うためにはRGB値を取得しなければいけません。
しかし、静止画ファイルでもそうですが、動画ファイルのほとんどは”圧縮”技術によってファイルサイズが小さくなっています。
(静止画で言うところのjpgやgif等です)
そして.aviというのは汎用動画の拡張子です。
aviには圧縮の種類がたくさんあります。
有名なところでは”DivX”,”WMV9”などなど・・・
プログラムで扱うにはまず読み込んだaviファイルがどの圧縮方式でエンコードされているか調査する必要があります。
そしてエンコードの種類がわかれば該当するデコーダをインストールしなければなりません。
これでようやくaviファイルのRGB値を取得する準備が整いました。
(上記の事項はもしかしたらOpenCVがやってくれるかも知れませんが、私には知識がないのでわかりません)
これ以降はOpenCVの事をご存知の方にフォロー願います。
keibou21さん、ご回答ありがとうございます。
なるほど、.aviファイルといっても中身は圧縮されていて、いろいろな圧縮形式があったんですね。
そういった部分の知識が足りていませんでした。
>そしてエンコードの種類がわかれば該当するデコーダをインストールしなければなりません。
補足して質問なのですが、このエンコードの種類を調べるにはどうすればよいのでしょうか?
また、デコーダのインストールをすることで、aviファイルのRGB値を取得する準備ができるとのことですが、デコーダをインストールすればプログラム内では特にデコードは気にする必要はないのでしょうか?
それともプログラム内にデコードするための部分などが必要なのでしょうか?
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル、画像ファイル名の書かれたセル(複数個所)に画像を一括で表示させる方法 1 2023/04/19 00:19
- デジタルカメラ Windows8.1PCに動画、静止画を取り込めてムービーメーカーで動画編集できるオススメの6000 2 2022/11/07 12:10
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- UNIX・Linux Linux Ubuntu22.4の起動時エラーについて 2 2022/07/22 14:52
- YouTube ユーチューブへの動画投稿にサムネイルを付ける方法は? 1 2022/07/21 23:45
- 防犯カメラ・監視カメラ・小型カメラ VHSを高画質な動画ファイルにしたいです。 3 2022/05/06 12:08
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- Android(アンドロイド) Sumsung製SDXCカードの空き容量があるにも関わらず動画ファイルが転送できない 4 2023/03/02 13:52
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
VBScriptでのファイル結合処理...
-
dataファイルをxtxファイルにす...
-
gccでリソースファイルを使わな...
-
SSIを使わずに・・・
-
EXEファイルに画像ファイルの埋...
-
BMP → AVI 作成について
-
識別子の外部結合について
-
csvファイルを開かずに文字を検...
-
C++ visualstudio グローバル変数
-
Cでのネットワークファイルの読...
-
ファイルの結合
-
外部ファイルを読み込みたいの...
-
javaでMIDIファイルの取り出し...
-
PDFを全文検索するプログラム
-
VC++でのiniファイルの読み書き
-
パワーポイントの画面表示が点...
-
マクロを作成したファイルを立...
-
ソースとヘッダの境界とは?
-
ExcelVBA 定数宣言を外部ファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
dataファイルをxtxファイルにす...
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
CSVファイルへの保存の際、デー...
-
グローバル変数のよくない使い...
-
バッチで118項目のCSVを処理し...
-
テキストファイルの最終行を削...
-
VBAにてEXCEL以外のファイル(テ...
-
VBに、Cのincludeのようなもの...
-
分割コンパイルの#defineについて
-
RPGでファイル名(もしくはレコ...
-
SGファイルって何ですか?
-
マウスポインタの変更
-
Excelマクロでの再読込み方法
-
【C#】リソースファイルの埋め...
-
ダイアログボックスで複数フォ...
-
C言語のfopenについて教えてく...
-
ドラッグアンドドロップでファ...
-
「VBScript」ADODB.Streamにお...
おすすめ情報