Problem: Optical Flow zw. zwei Bildern mit OpenCV zu berechen

hanow

Mitglied
Guten Tag, Alle

Ich bin Anfänger für OpenCV und möchte ein paar Beispiele von den Funktionen testen.

Ich habe grad ein Problem mit der Berechnung des optischen Flusses zwischen 2 Bildern und komme grad mit meinem Code nicht weiter.

Mein Code:
Code:
//#include "StdAfx.h"
#include <opencv/cv.h>
#include <opencv/cxcore.h>
#include <opencv/highgui.h>
#include <stdio.h>
#include <stdlib.h>
const int MAX_CORNERS = 500;
int main(int argc, char** argv) {
   // Initialize, load two images from the file system, and
   // allocate the images and other structures we will need for
   // results.
    //
    IplImage* imgA = cvLoadImage("webcam001.png", CV_LOAD_IMAGE_GRAYSCALE);
    IplImage* imgB = cvLoadImage("webcam002.png", CV_LOAD_IMAGE_GRAYSCALE);
    CvSize img_sz = cvGetSize( imgA );
    int win_size = 10;
    IplImage* imgC = cvLoadImage("OpticalFlow1.jpg",CV_LOAD_IMAGE_UNCHANGED);
   
    // The first thing we need to do is get the features
    // we want to track.
    //
    IplImage* eig_image = cvCreateImage( img_sz, IPL_DEPTH_32F, 1 );
    IplImage* tmp_image = cvCreateImage( img_sz, IPL_DEPTH_32F, 1 );
    int corner_count = MAX_CORNERS;
    CvPoint2D32f *cornersA = new CvPoint2D32f[MAX_CORNERS];
    cvGoodFeaturesToTrack(
        imgA,
        eig_image,
        tmp_image,
        cornersA,
        &corner_count,
        0.01,
        5.0,
        0,
        3,
        0,
        0.04
    );
    cvFindCornerSubPix(
        imgA,
        cornersA,
        corner_count,
        cvSize(win_size,win_size),
        cvSize(-1,-1),
        cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03)
    );
    // Call the Lucas Kanade algorithm
    //
    char features_found[ MAX_CORNERS ];
    float feature_errors[ MAX_CORNERS ];
    CvSize pyr_sz = cvSize( imgA->width+8, imgB->height/3 );
    IplImage* pyrA = cvCreateImage( pyr_sz, IPL_DEPTH_32F, 1 );
    IplImage* pyrB = cvCreateImage( pyr_sz, IPL_DEPTH_32F, 1 );
    CvPoint2D32f *cornersB = new CvPoint2D32f[MAX_CORNERS];
  cvCalcOpticalFlowPyrLK(
     imgA,
     imgB,
     pyrA,
     pyrB,
     cornersA,
     cornersB,
     corner_count,
     cvSize( win_size,win_size ),
     5,
     features_found,
     feature_errors,
     cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3 ),
     0
  );
  // Now make some image of what we are looking at:
  //
  for( int i=0; i<corner_count; i++ ) {
     if( features_found[i]==0|| feature_errors[i]>550 ) {
//       printf("Error is %f/n",feature_errors[i]);
        continue;
     }
//    printf("Got it/n");
     CvPoint p0 = cvPoint(
        cvRound( cornersA[i].x ),
        cvRound( cornersA[i].y )
     );
     CvPoint p1 = cvPoint(
        cvRound( cornersB[i].x ),
        cvRound( cornersB[i].y )
     );
     cvLine( imgC, p0, p1, CV_RGB(255,0,0),2, CV_AA, 0 );
  }
  cvNamedWindow("ImageA",0);
  cvNamedWindow("ImageB",0);
  cvNamedWindow("LKpyr_OpticalFlow",0);
  cvShowImage("ImageA",imgA);
  cvShowImage("ImageB",imgB);
  cvShowImage("LKpyr_OpticalFlow",imgC);
  cvWaitKey(0);
  return 0;
}


l8d6z89kaawk.png


Kann mir jemand bitte helfen, um das Problem zu lösen?
unsure.png


Vielen Dank!

LG, Carvin
 
Zuletzt bearbeitet:
Hallo,

"new" gibt es nur bei C++. Du solltest daher deinen Sourcen mit dem g++ verarbeiten und am besten auch eine andere Endung (*.cpp) geben.

Gruß
MCoder
 
Vielen Dank, MCoder

Das ist ja der Grund meines Problems. Aber wenn ich das Problem als *.c Datei kompilieren möchte, was schreibe ich denn statt "new" ?

Danke.
 
C++:
CvPoint2D32f *cornersB = new CvPoint2D32f[MAX_CORNERS];
wird zu
C++:
CvPoint2D32f *cornersB = malloc(sizeof(CvPoint2D32f) * MAX_CORNERS);

Übrigens hast du ein delete (für new) bzw. free (für malloc) vergessen.
 
Zurück