雷って幻想的だよね?

宗教:C++、C#、ラノベ好きの戯言です。

DirectShow+OpenCV 未整理&テスト用を整理した

初期のデータ確保などを分けて、効率をよくした。

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;