1

私はこの非常に奇妙な問題を抱えており、何か間違ったことをしている可能性があると思いますが、Pyramidal Lucas Kanade の opencv1 実装と opencv2 実装があります。違いは、opencv2 は opencv1 と比較して実行に非常に長い時間がかかることです (特に goodFeaturesToTrack 関数)。さらに、opencv1 実装に opencv2 ライブラリとヘッダーを含めると、これも非常に遅くなります (画像 2 枚あたり 0.002 秒、画像 2 枚あたり 1 秒)。私は何か間違ったことをしていますか?

Windows 7、64 ビット。これは、1 秒あたり約 1 フレームで、非常に遅く実行される opencv2 コードです。前述したように、opencv1 実装を使用してライブラリ バージョンを切り替えると、同じように速度が 10 倍以上低下します。これは非常に奇妙だと思いますが、Google は何の情報も見つけられませんでした。ありがとう!!!

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <cmath>

using namespace cv;
using namespace std; 

int64 now, then;
double elapsed_seconds, tickspersecond=cvGetTickFrequency() * 1.0e6;
int main(int argc, char** argv)
{
    // Load two images and allocate other structures
    Mat imgA = imread("0000.png", CV_LOAD_IMAGE_GRAYSCALE);
    Mat imgB = imread("0001.png", CV_LOAD_IMAGE_GRAYSCALE); 
    Size img_sz = imgA.size();
    Mat imgC(img_sz,1);

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

 then = cvGetTickCount();
    goodFeaturesToTrack( imgA,cornersA,maxCorners,qualityLevel,minDistance,cv::Mat(),blockSize,true);
    goodFeaturesToTrack( imgB,cornersB,maxCorners,qualityLevel,minDistance,cv::Mat(),blockSize,true);

now = cvGetTickCount();
cout << (double)(now - then) / tickspersecond;


    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;
}
4

2 に答える 2

0

リリース ライブラリではなく、デバッグ ライブラリ (*d.lib) を使用している可能性があります。goodFeaturesToTrack() の呼び出しごとに〜1〜2秒で同じ問題が発生し、リリースに切り替えると解決しました。

于 2014-06-18T12:49:51.083 に答える
-1

goodFeaturesToTrack を 2 回呼び出すのはなぜですか?

一度呼び出して cornersA を取得し、LK を使用して imgB 内の同じコーナー/機能を識別します。

于 2013-10-04T19:58:19.733 に答える