忍者ブログ
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
ブログ内検索
[26]  [25]  [24]  [23]  [22]  [21]  [20]  [19]  [18]  [17]  [16
×

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

初期のデータ確保などを分けて、効率をよくした。
Bitmapはやっぱりいらなかったので削除して整理
変数も可読性を上げるためにやっていた物をなくした。

また、読み込み時にフラグを利用することで一度のみの読み込みを実装している。
Runをしてからでないと、ちょっと都合が悪いかもしれない・・・
再生に必要な設定の直後に初期化しようとしたら、メディアタイプの取得ができなかった・・・

参考:
BitMapフォーマット
 
↓のIMG0は分解して実装
 

void Video::initOpticalFlow()
{
    // 必要なバッファサイズを取得
    nBufferSize = 0;
    pSampleGrabber->GetCurrentBuffer(&nBufferSize,NULL);
 
    // 接続情報取得。
    // RenderFileによりGraphが構成された後に行う
    AM_MEDIA_TYPE am_media_type;
    pSampleGrabber->GetConnectedMediaType(&am_media_type);
    VIDEOINFOHEADER *pVideoInfoHeader =(VIDEOINFOHEADER *)am_media_type.pbFormat;
 
    //画像のバッファ確保
    pBuffer_start = (char *)malloc(nBufferSize);
    pBuffer_end = (char *)malloc(nBufferSize);
 
    //画像を入れる入れ物の作成
    src = cvCreateImage( cvSize(pVideoInfoHeader->bmiHeader.biWidth, pVideoInfoHeader->bmiHeader.biHeight), IPL_DEPTH_8U, 3);
    src2 = cvCreateImage( cvSize(pVideoInfoHeader->bmiHeader.biWidth, pVideoInfoHeader->bmiHeader.biHeight), IPL_DEPTH_8U, 3);
    dst = cvCreateImage( cvSize(pVideoInfoHeader->bmiHeader.biWidth, pVideoInfoHeader->bmiHeader.biHeight), IPL_DEPTH_8U, 1);
    dst2 = cvCreateImage( cvSize(pVideoInfoHeader->bmiHeader.biWidth, pVideoInfoHeader->bmiHeader.biHeight), IPL_DEPTH_8U, 1);
    //カラー画像を格納
    src->imageData=(char *)pBuffer_start;
    src2->imageData=(char *)pBuffer_end;
 
    // 速度ベクトルを格納する構造体の確保,等
    cols = pVideoInfoHeader->bmiHeader.biWidth;
    rows = pVideoInfoHeader->bmiHeader.biHeight;
    velx = cvCreateMat (rows, cols, CV_32FC1);
    vely = cvCreateMat (rows, cols, CV_32FC1);
}

 

 

void Video::showOpticalFlow( DWORD millisecond )
{
    if( !this->opticalFlow_init_flag )    this->initOpticalFlow();
 
    // 現在表示されている映像を静止画として取得
    pSampleGrabber->GetCurrentBuffer(&nBufferSize,(long *)pBuffer_start);    
    Sleep( millisecond );//差異を手に入れるために記述
    pSampleGrabber->GetCurrentBuffer(&nBufferSize,(long *)pBuffer_end);    
 
    //データが反転しているので逆転させる
    cvFlip(src,NULL,0);
    cvFlip(src2,NULL,0);
    //グレースケールへ変更
    cvCvtColor(src,dst,CV_RGB2GRAY);
    cvCvtColor(src2,dst2,CV_RGB2GRAY);
 
 
    // オプティカルフローを計算(LK)
    cvCalcOpticalFlowLK(dst, dst2, cvSize (15, 15), velx, vely);
    // 計算されたフローを描画(LK)
    int dx,dy;
    const int threshold = 15; //閾値
    for (int i = 0; i < cols; i += threshold) {
        for (int j = 0; j < rows; j += threshold) {
            dx = (int) cvGetReal2D (velx, j, i);
            dy = (int) cvGetReal2D (vely, j, i);
            cvLine (src2, cvPoint (i, j), cvPoint (i + dx, j + dy), CV_RGB (255, 0, 0), 1, CV_AA, 0);
        }
    }
    cvNamedWindow ("ImageLK", 0);
    cvShowImage ("ImageLK", src2);
}

設定変数一覧
//動画制御
HWND VideohWnd;
IGraphBuilder *pGraphBuilder;
IMediaControl *pMediaControl;
IMediaEventEx *pMediaEventEx;
IMediaSeeking *pMediaSeeking;
IVideoWindow *pVideoWindow;
IBasicAudio *pBasicAudio;
 
//画像情報取得
IBaseFilter *pSampleGrabberFilter;
ISampleGrabber *pSampleGrabber;
 
//オプティカルフローのための初期化&変数群
bool opticalFlow_init_flag;
void initOpticalFlow();
char *pBuffer_start, *pBuffer_end;
long nBufferSize;
int cols, rows;
CvMat *velx, *vely;
IplImage *src, *src2, *dst, *dst2;
 
PR
この記事にコメントする
Name
Title
Color
Mail
URL
Comment
Password   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
secret (管理人にのみ表示)
この記事へのトラックバック
この記事にトラックバックする:
Copyright ©  メモメモプログラム All Rights Reserved.
* material by Pearl Box   * Template by tsukika

忍者ブログ [PR]