光流评估

Optical Flow evaluation

我想从“http://sintel.is.tue.mpg.de/results”数据集获得 "EPE all EPE matched EPE unmatched d0-10 d10-60 d60-140 s0-10 s10-40 s40+" 光流结果。我使用 OpenCV 3,VC++ 2013,Win 7 64 位。我需要获得此结果的示例代码。

此致,

//////////编辑
未经评估的光流源代码

Size img_sz = imgA.size();
Mat imgC(img_sz,1);

int win_size = 15;
int maxCorners = 20; 
double qualityLevel = 0.05; 
double minDistance = 5.0; 
int blockSize = 3; 
double k = 0.04; 
std::vector<cv::Point2f> cornersA; 
cornersA.reserve(maxCorners); 
std::vector<cv::Point2f> cornersB; 
cornersB.reserve(maxCorners);


goodFeaturesToTrack( imgA,cornersA,maxCorners,qualityLevel,minDistance,cv::Mat());
goodFeaturesToTrack( imgB,cornersB,maxCorners,qualityLevel,minDistance,cv::Mat());

cornerSubPix( imgA, cornersA, Size( win_size, win_size ), Size( -1, -1 ), 
              TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03 ) );

cornerSubPix( imgB, cornersB, Size( win_size, win_size ), Size( -1, -1 ), 
              TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03 ) );

// Call Lucas Kanade algorithm

CvSize pyr_sz = Size( img_sz.width+8, img_sz.height/3 );

std::vector<uchar> features_found; 
features_found.reserve(maxCorners);
std::vector<float> feature_errors; 
feature_errors.reserve(maxCorners);

calcOpticalFlowPyrLK( imgA, imgB, cornersA, cornersB, features_found, feature_errors ,
    Size( win_size, win_size ), 5,
     cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.3 ), 0 );

// Make an image of the results

for( int i=0; i < features_found.size(); i++ ){
        cout<<"Error is "<<feature_errors[i]<<endl;
        //continue;

    cout<<"Got it"<<endl;
    Point p0( ceil( cornersA[i].x ), ceil( cornersA[i].y ) );
    Point p1( ceil( cornersB[i].x ), ceil( cornersB[i].y ) );
    line( imgC, p0, p1, CV_RGB(255,255,255), 2 );
}

namedWindow( "ImageA", 0 );
namedWindow( "ImageB", 0 );
namedWindow( "LKpyr_OpticalFlow", 0 );

imshow( "ImageA", imgA );
imshow( "ImageB", imgB );
imshow( "LKpyr_OpticalFlow", imgC );

cvWaitKey(0);

return 0;

}

}

float evaluationRMSE(Mat flow1, Mat flow2) {
    float sum = 0;
    int counter = 0;
    const int rows = flow1.rows;
    const int cols = flow1.cols;

    for (int y = 0; y < rows; ++y) {
        for (int x = 0; x < cols; ++x) {
            Vec2f flow1_at_point = flow1.at<Vec2f>(y, x);
            Vec2f flow2_at_point = flow2.at<Vec2f>(y, x);

            float u1 = flow1_at_point[0];
            float v1 = flow1_at_point[1];
            float u2 = flow2_at_point[0];
            float v2 = flow2_at_point[1];

            //if (isFlowCorrect(u1) && isFlowCorrect(u2) && isFlowCorrect(v1) && isFlowCorrect(v2)) 
            {
                sum += (u1 - u2)*(u1 - u2) + (v1 - v2)*(v1 - v2);
                counter++;
            }
        }
    }
    return (float)sqrt(sum / (1e-9 + counter));
}