忍者ブログ
Admin / Write / Res
パソコン関連のメモとして色々書いていきます。
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
ブログ内検索
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ビットマップのヘッダを手に入れるために以下を行う
AM_MEDIA_TYPE am_media_type;
pSampleGrabber->GetConnectedMediaType(&am_media_type);
VIDEOINFOHEADER *pVideoInfoHeader =(VIDEOINFOHEADER *)am_media_type.pbFormat;

上記の情報をビットマップのヘッダ情報へ置き換える
(bitsizeを使わなくてよくなるのであればほぼ不要になる記述)
BITMAPINFO BitmapInfo;
ZeroMemory( &BitmapInfo, sizeof(BitmapInfo) );
CopyMemory( &BitmapInfo.bmiHeader, &(pVideoInfoHeader->bmiHeader), sizeof(BITMAPINFOHEADER) );
long bitsize = BitmapInfo.bmiHeader.biSizeImage;

バッファの確保を行う
char *pBuffer = (char *)malloc(bitsize);
char *pBuffer2 = (char *)malloc(bitsize);

バッファを取得
pSampleGrabber->GetCurrentBuffer(&nBufferSize,(long *)pBuffer);
pSampleGrabber->GetCurrentBuffer(&nBufferSize,(long *)pBuffer2);


画像データの入れ物を作成
(srcがカラーでdstはグレースケール)
IplImage *src = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 3);
IplImage *src2 = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 3);
IplImage *dst = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1);
IplImage *dst2 = cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1);

バッファから格納する
src->imageData=(char *)pBuffer;
src2->imageData=(char *)pBuffer2;

データの反転を修正
cvFlip(src,NULL,0);
cvFlip(src2,NULL,0);

グレースケールへチャンネル数を下げる
cvCvtColor(src,dst,CV_RGB2GRAY);
cvCvtColor(src2,dst2,CV_RGB2GRAY);

あとは、dstをオプティカルフローの関数へ入れればOK

PR
//メモ //////////////////////////////////////////////////////////////
// OpenCV で実行時に cv::Exception がでる場合の対処方法
 
// オプティカルフロー関数類(cvCalcOpticalFlowPyrLK、cvCalcOpticalFlowHS)が動かない場合の対処方法
//////////////////////////////////////////////////////////////////////
 

読み込みで特殊な物↓ 過去を参考にファイルを作成

#include <qedit.h> // SampleGrabber用

次に

//COMの初期化?
CoInitialize(NULL);
戻り値は基本的に S_ で始まるため、エラーが帰ってこないらしい

RenderFileを利用する前に以下のことを行っておく


// SampleGrabber(Filter)を生成

CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC, IID_IBaseFilter, (LPVOID *)&pSampleGrabberFilter);
 
// FilterからISampleGrabberインターフェースを取得します
pSampleGrabberFilter->QueryInterface(IID_ISampleGrabber, (LPVOID *)&pSampleGrabber);
 
// SampleGrabberを接続するフォーマットを指定。
// ここがポイントです。
// ここの指定の仕方によりSampleGrabberの挿入箇所を
// 決定できます。このサンプルのような指定をすると
// 画面出力の寸前でサンプルを取得できます。
AM_MEDIA_TYPE am_media_type;
ZeroMemory(&am_media_type, sizeof(am_media_type));
am_media_type.majortype = MEDIATYPE_Video;
am_media_type.subtype = MEDIASUBTYPE_RGB24;
am_media_type.formattype = FORMAT_VideoInfo;
pSampleGrabber->SetMediaType(&am_media_type);
 
// GraphにSampleGrabber Filterを追加
pGraphBuilder->AddFilter(pSampleGrabberFilter,L"Sample Grabber");

RenderFileを利用した後、バッファからデータを取得するように変更する

pSampleGrabber->SetBufferSamples(TRUE);

TRUEでデータを取得し、FALSEで取得しないため、不要であればOFFにする

S_ で始める戻り値は常に関数の実行は成功していることを示す
E_ で始まる戻り値がエラーを示している

参考:
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200510/05100005.txt
内容は作成中なので、間違いを含みます・・・
ぶっちゃけ、メモです

//メモ:シーク制御において、IMediaSeeking で特定の地点へ移動させ、画像を取得する方法しかなさそう。
//まだ、画像取得はVMRを利用していないと、停止状態でないとできない
//IBasicVideoを利用
// タイムフォーマットhttp://msdn.microsoft.com/ja-jp/library/cc370946.aspx
// を利用しビデオフレームにして行う?//ビデオフレーム:TIME_FORMAT_FRAME
//this->pMediaSeeking->SetTimeFormat( &TIME_FORMAT_FRAME );
 
//初期画像と、次の場面の画像を取得テスト
//ナノ秒 1^-9乗
LONGLONG count=3^8; //0.8秒
this->pMediaSeeking->SetPositions(0,AM_SEEKING_AbsolutePositioning,0,AM_SEEKING_AbsolutePositioning);
this->pMediaSeeking->SetPositions(NULL,AM_SEEKING_NoPositioning, &count,AM_SEEKING_IncrementalPositioning);
 
//タイムスタンプをなくすことで高速処理? pMediaFilter->SetSyncSource(NULL);
 
最初は
IBasicVideoを利用してやろうとしてたのだが・・・
今まで再生できていたのが再生できなくなった・・・
⇒ヤバイ

IBasicVideoは制約が大きいのでとか言い訳してみる。

というわけで、qedit.h を使いたくはなかったが、使うように変更することに・・・
まず、
http://blogs.yahoo.co.jp/sealion1945/59282388.html
をみて編集
*** 以下コピー ***
SampleGrabberを使用する場合に必要となる、Qedit.hを取得し修正する。

■取得
http://www.koders.com/cpp/fid614F3E471D5D6B7854B5549ADFEC790E3B8703F6.aspx

■修正-以下の5ヶ所をコメントアウトする
//#include "dxtrans.h"
IDxtCompositor //: public IDXEffect
IDxtAlphaSetter //: public IDXEffect
IDxtJpeg //: public IDXEffect
IDxtKey //: public IDXEffect
*** ここまで ***
取得では左上にダウンロードがあるので、そのままファイルをもらってきた。

で、これからいじいじしていく。。。
1.System32 にコピーする
2.【regsvr32 /u ファイル名】 と入力する
  例:
regsvr32 flvsplitter.ax

また、エラーが出た場合はコマンドプロンプトを管理者として実行して、上記のことを行うとインストールできることもある。

以上
Copyright ©  メモメモプログラム All Rights Reserved.
* material by Pearl Box   * Template by tsukika

忍者ブログ [PR]