動画シリーズ オプティカルフロー2 cvCalcOpticalFlowBM

やはり遅い。

オプティカルフロー2 cvCalcOpticalFlowBM」を参考にして動画にしました。
サンプルから動画への変換は「while句がある動画」を参考にすること。
メモリーリークの対応は、「ヒープ領域に作られるmalloc的な関数の使用上の注意」を参考にすること。
名前:
コメント:
「今日の訪問数: -
「昨日の訪問数: -
「今までの訪問数: -
#include <stdio.h>
#include <windows.h>
#include <cv.h>
#include <highgui.h>
 
int
main (int argc, char **argv)
{
CvCapture *capture;
 
  int i, j, dx, dy, rows, cols;
  int block_size = 10;
  int shift_size = 1;
  CvMat *velx, *vely;
  CvSize block = cvSize (block_size, block_size);
  CvSize shift = cvSize (shift_size, shift_size);
  CvSize max_range = cvSize (50, 50);
  IplImage *src_img1, *src_img2, *dst_img;
  IplImage *tmp;
 
 capture = cvCreateCameraCapture(0);
  cvNamedWindow ("Image", 1);
     // (src_img1 = cvLoadImage (argv[1], CV_LOAD_IMAGE_GRAYSCALE)) == 0 ||
      //(src_img2 = cvLoadImage (argv[2], CV_LOAD_IMAGE_GRAYSCALE)) == 0)
  dst_img = cvQueryFrame(capture);//カメラから画像を取り込む
  tmp = cvCreateImage(cvGetSize(dst_img), IPL_DEPTH_8U, 3);
  src_img1 = cvCreateImage(cvGetSize(dst_img), IPL_DEPTH_8U, 1);
  src_img2 = cvCreateImage(cvGetSize(dst_img), IPL_DEPTH_8U, 1);
  cvShowImage ("Image", dst_img);
  //dst_img = cvLoadImage (argv[2], CV_LOAD_IMAGE_COLOR);
 
while(1){
  // (1)速度ベクトルを格納する構造体の確保
  rows = int (ceil (double (src_img1->height) / block_size));
  cols = int (ceil (double (src_img1->width) / block_size));
  velx = cvCreateMat (rows, cols, CV_32FC1);
  vely = cvCreateMat (rows, cols, CV_32FC1);
  cvSetZero (velx);
  cvSetZero (vely);
 
  dst_img = cvQueryFrame(capture);//カメラから画像を取り込む
  cvCvtColor(dst_img,src_img1,CV_BGR2GRAY);
  cvCopy(dst_img,tmp);
  // (2)オプティカルフローの計算
  cvCalcOpticalFlowBM (src_img1, src_img2, block, shift, max_range, 0, velx, vely);
 
  // (3)計算されたフローを描画
  for (i = 0; i < velx->width; i++) {
    for (j = 0; j < vely->height; j++) {
      dx = (int) cvGetReal2D (velx, j, i);
      dy = (int) cvGetReal2D (vely, j, i);
      cvLine (dst_img, cvPoint (i * block_size, j * block_size), cvPoint (i * block_size + dx, j * block_size + dy), CV_RGB (255, 0, 0), 1, CV_AA, 0);
    }
  }
 
  cvShowImage ("Image", dst_img);
  cvCvtColor(tmp,src_img2,CV_BGR2GRAY);
//printf("%d\n",__LINE__);
  int key=cvWaitKey (10);
  if(key>=0)break;
//  cvReleaseImage (&dst_img);
  cvReleaseMat (&velx);
  cvReleaseMat (&vely);
 
}
 
  cvDestroyWindow ("Image");
  cvReleaseImage (&src_img1);
  cvReleaseImage (&src_img2);
  cvReleaseImage (&tmp);
 // cvReleaseImage (&dst_img);
  cvReleaseMat (&velx);
  cvReleaseMat (&vely);
  cvReleaseCapture(&capture); //終了後に固まるのはこれがないことが多い
 
  return 0;
}
 
最終更新:2010年01月27日 09:44
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。