【问题标题】:OpenCV running slowOpenCV 运行缓慢
【发布时间】:2011-05-15 17:45:07
【问题描述】:

我在 vs2010/win7 上安装了 OpenCV,但是我看到了一些我无法弄清楚的行为。

我是 OpenCV 的新手,所以只有一个基本程序可以从 avi 文件中提取帧 - 然后它将该帧拆分为单通道图像并为每个图像生成直方图(取自互联网示例)。它实际上一切正常,只是 非常 慢。事实证明 cvFillConvexPoly 实际上需要 10-15 秒(有时更长)才能完成 - 但当它最终返回时它是正确的。

这是我调用罪魁祸首函数的代码 sn-p,如您所见,我还尝试了 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 位导致问题的方式。

【问题讨论】:

  • 确定:时间都在同一台机器上?与其他结果相比有多慢?
  • Ubuntu 安装在一台速度较慢的机器上,当我在那里运行它时,上面的函数(DrawHistogram)在不到一秒的时间内运行。在我的 Windows 机器上,它需要半个多小时(我停止看时钟,让它完成)
  • @tom502 也许你的 windows 机器有一个较小的缓存,所以你得到更多的缓存未命中
  • @tom502 简而言之:当你幸运时,你的程序核心适合 CPU 缓存,否则 CPU 必须等待 RAM。见CPU Cache
  • 啊,好吧...好吧,不是这样 - win7 电脑上 6M 缓存,另一台电脑上 2M

标签: visual-studio-2010 opencv


【解决方案1】:

我可以在您的代码中发现 2 个可能的错误,这两个错误都与边界有关。在数组边界之外读取/写入可能会导致各种意外行为,因此您的程序不会崩溃是一个奇迹。也许 GCC 和/或 OpenCV 库在 Ubuntu 和 Windows 上的行为不同,导致它不会在 Ubuntu 上崩溃,但您绝对应该看看以下 2 点。

  1. 我假设sX 是比例因子?您的for 循环应该从0 运行到(BINS-1),因为您使用i 来索引您的直方图并且有BINS 箱,而不是BINS*sX。只要sX == 1 您不会遇到麻烦,但任何其他值都会使您的直方图绘制代码无效。您已经在 cvPoint 声明中以正确的方式使用了 sX

  2. 根据cvFillConvexPoly 函数的文档,n 应该是点数,在您的情况下是 4,而不是 5。

【讨论】:

  • OH MY........我没有注意到 4 是 5。谢谢,你刚刚救了我拔头发。现在来调查一下为什么这不会在 Linux 上引起问题!
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 2021-11-25
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多