【问题标题】:goodFeaturesToTrack OpenCV 2.4 Extremely Slow compared to Opencv1goodFeaturesToTrack OpenCV 2.4 与 Opencv1 相比非常慢
【发布时间】:2013-06-09 07:42:03
【问题描述】:

我有一个非常奇怪的问题,我想我可能做错了什么,但我有一个用于 Pyramidal Lucas Kanade 的 opencv1 实现和一个 opencv2 实现。不同之处在于 opencv2 与 opencv1 相比需要更长的时间来运行(特别是 goodFeaturesToTrack 函数)。此外,在 opencv1 实现中包含 opencv2 库和头文件也会导致该库变得非常慢(我们说的是每两个图像 0.002 秒,而每两个图像 1 秒)。我做错了吗?

Windows 7、64 位。这是运行速度非常慢的 opencv2 代码,大约每秒 1 帧。正如我所说,采用 opencv1 实现和切换库版本会导致同样的速度下降 10 倍或更多。我认为这很奇怪,谷歌没有提供任何信息!谢谢!!!

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

【问题讨论】:

  • 你的 cv1 实现有什么不同?顺便说一句,cvGoodFeaturesToTrack() 只是 cv::goodFeaturesToTrack() 的包装。
  • cv1 的实现类似,但使用了另一个在网上找到的常见示例:cvGoodFeaturesToTrack 有一些虚拟输入,如 eig_image(来自robots.stanford.edu/cs223b05/notes/…),它使用 IplImage 而不是 MAT。但正如我所说,实现似乎无关紧要,因为将包含库从 opencv1 更改为 opencv2 并且仍然使用 opencv1 实现(向后兼容)会导致同样的缓慢。
  • Leo 你有没有找到解决这个问题的方法?我遇到了类似的事情
  • @Bobby Pardridge 你有没有找到解决这个问题的方法?我遇到了类似的事情

标签: c++ visual-studio-2010 debugging opencv


【解决方案1】:

您可能正在使用调试库 (*d.lib) 而不是发布库。我遇到了同样的问题,每次调用 goodFeaturesToTrack() 大约 1-2 秒,然后切换到发布解决了它。

【讨论】:

    【解决方案2】:

    你为什么要调用 goodFeaturesToTrack 两次?

    调用一次得到cornersA,然后使用LK识别imgB中相同的corner/features。

    【讨论】:

      猜你喜欢
      • 2021-02-13
      • 2017-05-07
      • 1970-01-01
      • 2015-01-27
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 2019-02-17
      相关资源
      最近更新 更多