パソコン関連のメモとして色々書いていきます。
カレンダー
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 |
ブログ内検索
初期のデータ確保などを分けて、効率をよくした。
Bitmapはやっぱりいらなかったので削除して整理
変数も可読性を上げるためにやっていた物をなくした。
また、読み込み時にフラグを利用することで一度のみの読み込みを実装している。
Runをしてからでないと、ちょっと都合が悪いかもしれない・・・
再生に必要な設定の直後に初期化しようとしたら、メディアタイプの取得ができなかった・・・
参考:
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
この記事にコメントする
最新記事
(10/18)
(10/18)
(10/18)
(10/18)
(10/11)
(09/27)
(09/24)
(09/18)
(09/14)
(09/13)
(09/13)
(09/13)
(09/13)
(09/12)
(09/12)
(09/12)
(09/12)
(09/12)
(09/12)
(09/12)
(09/06)
(09/06)
(09/04)
(09/04)
(09/03)