- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个非常奇怪的问题,我想我可能做错了什么,但我有一个用于 Pyramidal Lucas Kanade 的 opencv1 实现和一个 opencv2 实现。区别在于 opencv2 与 opencv1 相比需要更长的运行时间(特别是 goodFeaturesToTrack 函数)。此外,在 opencv1 实现中包含 opencv2 库和 header 也会导致它变得非常慢(我们说的是每两张图像 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;
}
最佳答案
您可能正在使用调试库 (*d.lib) 而不是发布库。我遇到了同样的问题,每次调用 goodFeaturesToTrack() 约 1-2 秒并切换到发布解决了它。
关于c++ - goodFeaturesToTrack OpenCV 2.4 与 Opencv1 相比极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17078297/
我正在尝试在 lena 的灰度图像上使用 opencv 2.4.3 的 goodFeatureToTrack() 函数...但是我总是得到一个零大小的向量,将特征存储为 cv::Point2f...我
我正在尝试使用 cv::calcOpticalFlowPyrLK但有时该函数中的内部断言会失败。断言是 npoints = prevPtsMat.checkVector(2, CV_32F, true
我有角点,我正在尝试使用 cv::fitline 来拟合线但是我得到了图片中显示的来自原点 0,0 的线。 如果有帮助的话,我还有投影矩阵和 View 矩阵以及相机 intersincs 参数 我正在
cvGoodFeaturesToTrack(frame1_1C, eig_image, 临时图像,frame1_features,&number_of_features, .01, .01, 空);
我正在尝试的代码: let src = cv.imread('inputImage'); // read from let temp = new cv.Mat(); src.convertTo(t
我正在尝试迭代我从 cv::goodFeaturesToTrack 获得的点数。 我使用此代码检索我的积分: std::vector > corners; cv::goodFeaturesToTrac
我正在开发 Android 视频稳定应用程序!我遇到了一些与 goodfeaturestotrack 和 calcOpticalFlowPyrLK 函数相关的问题,因为最终输出是相同的点!我用谷歌搜索
是否有一种快速的解决方案可以仅在我感兴趣的 blob 的轮廓内指定 ROI? 到目前为止我的想法: 使用boundingRect,但它包含太多我不想分析的东西。 将 goodFeaturesToTra
我有一个非常奇怪的问题,我想我可能做错了什么,但我有一个用于 Pyramidal Lucas Kanade 的 opencv1 实现和一个 opencv2 实现。区别在于 opencv2 与 open
我刚刚开始学习如何使用 openCV 库。我已经下载并安装了 openCV 2.4.0,并运行了一些示例项目。在此代码块中,我试图从 goodFeaturesToTrack 获取输出并在图像上绘制点。
我是一名优秀的程序员,十分优秀!