2013-06-13 92 views
1

我有这个非常奇怪的问题,我想我可能会做一些错误的事情,但是我有一个用于Pyramidal Lucas Kanade和opencv2实现的opencv1实现。不同之处在于opencv2比opencv1需要更长的时间运行(尤其是goodFeaturesToTrack函数)。另外,在opencv1中包含opencv2库和头文件会导致该文件变得非常慢(我们谈论的是每两张图像0.002秒,而每张两张图像只有1秒)。难道我做错了什么?goodFeaturesToTrack OpenCV 2.4与Opencv1相比非常慢

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; 
} 
+0

你的cv1实现有什么不同?顺便说一句'cvGoodFeaturesToTrack()'只是'cv :: goodFeaturesToTrack()'的一个包装。 – Bull

+0

cv1 implmentation是相似的,但使用在线找到的另一个常见示例:cvGoodFeaturesToTrack有一些虚拟输入,如eig_image(来自http://robots.stanford.edu/cs223b05/notes/CS%20223-B%20T1%20stavens_opencv_optical_flow.pdf),它使用IplImage而不是MAT。但正如我所说,实现似乎无关紧要,因为从opencv1将包含库更改为opencv2,仍然使用opencv1实现(向后兼容)会导致相同的缓慢。 –

+0

狮子座你有没有找到解决这个问题的办法?我遇到类似的事情 –

回答

-2

你为什么要调用goodFeaturesToTrack两次?

调用一次获取角点然后使用LK识别imgB中的相同角/特征。

0

您可能正在使用调试库(* d.lib)而不是发行版。对于goodFeaturesToTrack(),每次调用〜1-2s都有同样的问题,并且切换到发布版解决了它。

相关问题