我已经在 vs2010/win7 上安装了 OpenCV,但是我看到了一些我无法理解的行为。
我是 OpenCV 的新手,所以只有一个基本程序可以从 avi 文件中提取帧 - 然后将该帧拆分为单 channel 图像并为每个图像生成直方图(取自互联网示例)。它实际上一切正常,只是极度慢。事实证明,cvFillConvexPoly 实际上需要 10-15 秒(有时更长)才能完成 - 但当它最终返回时它是正确的。
这是我调用罪魁祸首函数的代码片段,如您所见,我还尝试了 cvFillPoly,它花费了相同的时间来完成。
IplImage* DrawHistogram(CvHistogram *hist, float sX)
{
float histMax = 0;
cvGetMinMaxHistValue(hist, 0, &histMax, 0, 0);
IplImage *imgHist = cvCreateImage(cvSize(256, 64), IPL_DEPTH_8U, 1);
cvZero(imgHist);
float histValue = 0;
float nextValue = 0;
for (int i = 0; i < ((BINS - 1)*sX); i++)
{
histValue = cvQueryHistValue_1D(hist, i);
nextValue = cvQueryHistValue_1D(hist, i + 1);
CvPoint p1 = cvPoint(i * sX, 64);
CvPoint p2 = cvPoint((i + 1) * sX, 64);
CvPoint p3 = cvPoint((i + 1) * sX, 64 - histValue*(64/histMax));
CvPoint p4 = cvPoint(i * sX, 64 - histValue*(64/histMax));
int n = 5;
CvPoint pts[] = {p1, p2, p3, p4};
cvFillConvexPoly(imgHist, pts, n, cvScalar(255));
//cvFillPoly(imgHist, pts, &n, 1,cvScalar(255));
}
return imgHist;
}
感谢任何帮助。
使用 CMake 2.8.2/VS2010 作为 32 位在 Win7 x64 上编译。调试时和作为独立运行时的行为相同。
还可以在 Ubuntu 10.10 32 位上运行,使用 gcc 4.4.5 编译,没有问题。
编辑
我试过用 VS2008 重新编译,它仍然做同样的事情。我不明白什么会导致它运行如此缓慢 - 除非是 64 位 Windows“模拟”32 位导致问题的方式。
最佳答案
我可以在您的代码中发现 2 个可能的错误,这两个错误都与边界有关。在数组边界外读/写可能会导致各种意外行为,所以你的程序不崩溃就是一个奇迹。也许 GCC 和/或 OpenCV 库在 Ubuntu 和 Windows 上的行为不同导致它不会在 Ubuntu 上崩溃,但您绝对应该看看以下两点。
我假设
sX
是比例因子?你的for
循环应该从0
运行到(BINS-1)
无论这种缩放,因为你使用的是i
来索引您的直方图,并且有BINS
bin,而不是BINS*sX
。只要sX == 1
您就不会遇到麻烦,但任何其他值都会使您的直方图绘制代码无效。您已经在cvPoint
声明中以正确的方式使用了sX
。根据
cvFillConvexPoly
的文档函数,n
应该是点数,在您的情况下是 4,而不是 5。
关于visual-studio-2010 - OpenCV 运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6010111/