動画シリーズ オプティカルフロー3 cvCalcOpticalFlowPyrLK

動画シリーズ オプティカルフロー2 cvCalcOpticalFlowBMに比べて断然早い。

オプティカルフロー3 cvCalcOpticalFlowPyrLK」を参考にして動画にしました。
サンプルから動画への変換は「while句がある動画」を参考にすること。
メモリーリークの対応は、「ヒープ領域に作られるmalloc的な関数の使用上の注意」を参考にすること。
  • サンプルソースありがとう -- 名無しさん (2012-02-07 00:23:48)
名前:
コメント:
「今日の訪問数: -
「昨日の訪問数: -
「今までの訪問数: -
#include <stdio.h>//for printf()
#include <cv.h>
#include <highgui.h>
 
int
main (int argc, char **argv)
{
	CvCapture *capture;//(add.1)
  char *status;
  int i, corner_count = 150;
  CvPoint2D32f *corners1, *corners2;
  CvTermCriteria criteria;
  IplImage *src_img1, *src_img2, *dst_img;
  IplImage *eig_img, *temp_img;
  IplImage *prev_pyramid, *curr_pyramid;
  IplImage *tmp;
 
  capture = cvCreateCameraCapture(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);//グレースケールへ変換
  // (1)必要な構造体の確保
  eig_img = cvCreateImage (cvGetSize (src_img1), IPL_DEPTH_32F, 1);
  temp_img = cvCreateImage (cvGetSize (src_img1), IPL_DEPTH_32F, 1);
  corners1 = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f));
  corners2 = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f));
  prev_pyramid = cvCreateImage (cvSize (src_img1->width + 8, src_img1->height / 3), IPL_DEPTH_8U, 1);
  curr_pyramid = cvCreateImage (cvSize (src_img1->width + 8, src_img1->height / 3), IPL_DEPTH_8U, 1);
  status = (char *) cvAlloc (corner_count);
  criteria = cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 64, 0.01);
  cvNamedWindow ("Image");
 
while(1){
  dst_img=cvQueryFrame(capture);
  cvCopy(dst_img,tmp);
  cvCvtColor(dst_img,src_img1,CV_BGR2GRAY);
 
  // (2)疎な特徴点を検出
  cvGoodFeaturesToTrack (src_img1, eig_img, temp_img, corners1, &corner_count, 0.001, 5, NULL);
  printf("found:%d\n",corner_count);
  //どこを特徴点にしたのかわかりにくにので独自に追加した。
  //コーナーの描画  青色
  //cvFindCornerSubPix (src_img1, corners1, corner_count, cvSize (3, 3), cvSize (-1, -1), cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03));
  for (i = 0; i < corner_count; i++)
    cvCircle (dst_img, cvPointFrom32f (corners1[i]), 3, CV_RGB (0, 0, 255), 2);
 
  // (3)オプティカルフローを計算
  cvCalcOpticalFlowPyrLK (src_img1, src_img2, prev_pyramid, curr_pyramid, corners1, corners2, corner_count, cvSize (10, 10), 4, status, NULL, criteria, 0);
 
  // (4)計算されたフローを描画
  for (i = 0; i < corner_count; i++) {
    if (status[i])
      cvLine (dst_img, cvPointFrom32f (corners1[i]), cvPointFrom32f (corners2[i]), CV_RGB (255, 0, 0), 1, CV_AA, 0);
  }
  cvShowImage ("Image", dst_img);
  cvCvtColor(tmp,src_img2,CV_BGR2GRAY);
  //cvShowImage ("Image", src_img1);
  int key=cvWaitKey(100);
  if(key>=0)break;
}
 
 
  cvDestroyWindow ("Image");
  cvReleaseImage (&src_img1);
  cvReleaseImage (&src_img2);
  //cvReleaseImage (&dst_img);
  cvReleaseImage (&eig_img);
  cvReleaseImage (&temp_img);
  cvReleaseImage (&prev_pyramid);
  cvReleaseImage (&curr_pyramid);
  cvReleaseImage (&tmp);
  cvReleaseCapture(&capture); //終了後に固まるのはこれがないことが多い
 
  return 0;
}
 
最終更新:2012年02月07日 00:23
ツールボックス

下から選んでください:

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