我在vs2010 / win7上安装了OpenCV但是我看到了一些我无法弄清楚的行为。
我是OpenCV的新手,所以只需要一个从avi文件中提取帧的基本程序 - 然后将该帧拆分为单个通道图像,并为每个图像生成直方图(取自互联网示例)。它实际上一切正常,它只是非常慢。事实证明,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;
}
感谢任何帮助。
在Win7 x64上编译,CMake 2.8.2 / VS2010为32位。调试时以及作为独立运行时的行为相同。
还可以在Ubuntu 10.10 32位上运行,使用gcc 4.4.5编译,其中不是问题。
修改
我尝试过使用VS2008进行重新编译,它仍然会做同样的事情。我不明白是什么原因导致它运行得如此缓慢 - 除非它是64位窗口“模拟”32位导致问题的方式。
答案 0 :(得分:0)
我可以在您的代码中发现2个可能的错误,这两个错误都与边界有关。在数组边界外读/写可能会导致各种意外行为,因此您的程序不会崩溃是一个奇迹。也许GCC和/或OpenCV库在Ubuntu和Windows上表现不同,导致它不会在Ubuntu上崩溃,但你一定要看看以下2点。
我认为sX
是缩放因子?无论这种缩放,您的for
循环应该从0
运行到(BINS-1)
,因为您使用i
索引直方图并且有BINS
个分箱,不是BINS*sX
。只要sX == 1
您不会遇到麻烦,但任何其他值都会使您的直方图绘图代码无效。您已在sX
声明中以正确的方式使用cvPoint
。
根据cvFillConvexPoly
函数的文档,n
应为点数,在您的情况下为4,而不是5。