外出自粛中でも楽しく過ごす!QAまとめ>>

 タイトルの通りなんですが、動画像の読み込みをしたいのですが、C初心者なのでわかりません。アドバイスやサイトの紹介、なんでも結構ですのでどなたか教えて下さい。よろしくお願いします。
 形式はAVI、Mpegのどちらかでやろうと思ってます。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

#1の方に倣って、OSはWindowsと仮定しますが。



一番手っ取り早いのは、やっぱしMCIを使うことではないかと。

mmsystem.hをインクルードし、winmm.libをリンクしておき、
mciSendString関数を使えば、mpegでもAVIでも扱えます。

詳しい解説は参考URLをどうぞ。

参考URL:http://www2s.biglobe.ne.jp/~maekawa/dev/vc/mci/
    • good
    • 0

こんにちは、honiyonです。



 OSは何でしょうか?

 Windowsであれば、WindowsMediaやActiveMovieを利用するのが一番簡単です。
 ActiveXを利用し、WindowsMediaや、ActiveMovieを取り込み、制御できるようになります。

 私は C/C++でこれを利用したことがないので詳しいインポート手順は説明できないですが...(^^;

 簡単な使用方法ですが、WindowsMediaをインポートしたら、
  WindowsMedia.FileName = "hoge.avi";
  WindowsMedia.Play();
 で再生できます。

 上記の通り WindowsMediaはクラスです。 ひょっとしたら Cでは無理で、C++になるかもしれません。
 因みに、C++ Builderであれば、ActiveXを利用するためのウィザードがあり、それを使ってインストールをし、WindowsMediaをウインドウに置くだけで即利用可能です。 Visual C++でも同様の機能があるかもしれません。

 その他OSでの楽の仕方はわかりません(^^; 1からAVIやMPEGの仕組みを勉強して、自力で再生プログラムを作る必要があるかもしれません。

 参考になれば幸いです(..
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q動画処理のライブラリについて

現在WindowsのVC++で動画ファイル(.avi)に画像処理を行いたいと思っています。

もう少し具体的に述べますと、.aviファイルを読み込み、その映像にエッジ抽出や差分画像抽出などの画像処理を施して、画像処理された新たな.aviファイルを出力するというものです。

しかし、1から画像処理プログラミングを行うほどの知識もなく、どうすれば…と思っていたところ、OpenCVなど画像処理ライブラリというものがあることを知りました。

それを用いて.bmpなどの静止画像のエッジを取ったりというような処理はなんとなくわかったのですが、.aviファイルなどの動画ファイルに対する画像処理の方法がよくわからないのです。

動画というものは静止画の集合なので、動画像処理は静止画像処理を連続的に行えばよいと耳にしたのですが、これは正しいのでしょうか?

もし正しいのであれば、.avi動画ファイルにたいして連続的な静止画処理を行い、また.aviファイルを出力するということはOpenCVを用いてできるのでしょうか?

また、そういったことが詳しく解説されている書籍や日本語サイトなどがあれば教えていただけませんでしょうか。

素人の質問ではありますが、皆様どうぞよろしくお願いいたします。

現在WindowsのVC++で動画ファイル(.avi)に画像処理を行いたいと思っています。

もう少し具体的に述べますと、.aviファイルを読み込み、その映像にエッジ抽出や差分画像抽出などの画像処理を施して、画像処理された新たな.aviファイルを出力するというものです。

しかし、1から画像処理プログラミングを行うほどの知識もなく、どうすれば…と思っていたところ、OpenCVなど画像処理ライブラリというものがあることを知りました。

それを用いて.bmpなどの静止画像のエッジを取ったりというような処理はなんと...続きを読む

Aベストアンサー

>上記のプログラムのどの部分を変更して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/OpenCV/pukiwiki/pukiwiki.php?FrontPage

>上記のプログラムのどの部分を変更してVC++にコピーして実行すれば動くものなのでしょうか?

とりあえずOpenCVをダウンロードしてビルドしなければいけません。それでビルドが通ると"なんとか.lib"や"なんとか.dll"が生成されて、それをリンクして自分のプログラムを書く形になります。VCの人のためにビルド用プロジェクトが用意してあるのですが、私の環境(VC6)では一発でコンパイル通りませんでしたので、いろいろコメントアウトしながらだましだましやりました。とてもめんどくさいです。
下のソースの...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QOpenCVでの動画出力

現在VisualStudio2008とOpenCVを用いて、USBカメラから得られた映像をavi形式で保存しようとしています。
プログラムは以下のサイトを参考にしました。
http://chihara.naist.jp/opencv/?%A5%AD%A5%E3%A5%D7%A5%C1%A5%E3%A1%F5%C6%B0%B2%E8%A5%D5%A5%A1%A5%A4%A5%EB%BD%D0%CE%CF

プログラムを実際に動かしてみたところ確かに出力はされているのですが、映像がとても速いです(実際には20秒程なのに1,2秒で再生されてしまいます)。
この現象を回避する方法がありましたら是非教えていただきたいです。
よろしくお願いします。

Aベストアンサー

おそらく,USBカメラからキャプチャしたデータが2フレーム/秒など,
フレームレートの遅いビデオデータなのでしょう(カクカクしてませんか?).
その状態でデフォルト設定で書き込みすると,15フレーム/秒で保存され,早送り状態になってしまいます.

回避策ですが,以下で行けないでしょうか.
(USBカメラが手元にないので未検証です)

1.cvCaptureFromCAM関数の後で,cvGetCaptureProperty関数を実行して,キャプチャのフレームレート(CV_CAP_PROP_FPS)を取得する.
(おそらく2とか出てくるはず)

2.cvCreateVideoWriter関数で,fpsの設定を15ではなく,上で取得したフレームレートを代入する様に変える.

関数仕様は以下にあります.
http://opencv.jp/opencv-1.0.0/document/opencvref_highgui_video.html
cvCreateVideoWriterのfps値が任意の小さな値に変えられるのかどうかも未検証です.
駄目ならば,かなり乱暴ですが,cvWriteFrameを10連続くらいで実行してみては(要は,10倍速になってしまうなら,同じ画を10回並べてしまう).

おそらく,USBカメラからキャプチャしたデータが2フレーム/秒など,
フレームレートの遅いビデオデータなのでしょう(カクカクしてませんか?).
その状態でデフォルト設定で書き込みすると,15フレーム/秒で保存され,早送り状態になってしまいます.

回避策ですが,以下で行けないでしょうか.
(USBカメラが手元にないので未検証です)

1.cvCaptureFromCAM関数の後で,cvGetCaptureProperty関数を実行して,キャプチャのフレームレート(CV_CAP_PROP_FPS)を取得する.
(おそらく2とか出てくるはず)...続きを読む


人気Q&Aランキング