我有这个非常奇怪的问题,我想我可能会做一些错误的事情,但是我有一个用于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;
}
你的cv1实现有什么不同?顺便说一句'cvGoodFeaturesToTrack()'只是'cv :: goodFeaturesToTrack()'的一个包装。 – Bull
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实现(向后兼容)会导致相同的缓慢。 –
狮子座你有没有找到解决这个问题的办法?我遇到类似的事情 –