【问题标题】:Why is cv::resize so slow?为什么 cv::resize 这么慢?
【发布时间】:2013-01-28 22:57:26
【问题描述】:

我正在对实时视频源进行边缘检测:

- (void)processImage:(Mat&)image;
{
        cv::resize(image, smallImage, cv::Size(288,352), 0, 0, CV_INTER_CUBIC);
        edgeDetection(smallImage);
        cv::resize(smallImage, image, image.size(), 0, 0, CV_INTER_LINEAR);
}

edgeDetection 做了一些相当繁重的工作,并且在视频帧大小为 1280x720 的情况下以相当低的帧速率运行。添加resize 调用显着降低了帧速率,这与我的预期完全相反。这仅仅是因为调整大小操作很慢,还是因为我做错了什么?

smallImage 在标头中声明如下:

@interface CameraController : UIViewController
<CvVideoCameraDelegate>
{
    Mat smallImage;
}

它没有初始化,它工作正常。

【问题讨论】:

    标签: ios objective-c opencv image-processing


    【解决方案1】:

    调整图像大小的速度很慢,而且您要为每个处理过的帧执行两次。有几种方法可以以某种方式改进您的解决方案,但您必须提供有关您尝试解决的问题的更多详细信息。

    首先,在检测边缘之前调整图像大小会导致向边缘检测提供更少的信息,因此会导致检测到更少的边缘 - 或者至少会使检测它们变得更加困难。

    使用的调整大小算法也会影响其速度,CV_INTER_LINEAR 对于 cv::resize 来说是最快的,如果我的记忆没有失败 - 并且您正在使用 CV_INTER_CUBIC 进行第一次调整大小。

    调整图像大小的一个替代方法是处理原始图像的较小区域。为此,您应该查看 opencv 图像 ROI(感兴趣区域)。这很容易做到,你在这个网站上有很多关于这些的问题。缺点是您将只检测一个区域中的边缘而不是整个图像,这可能没问题,具体取决于问题。

    如果你真的想调整图片大小,opencv 开发者在处理更小的图片时通常会使用 pyrDownpyrUp 函数,而不是 resize。我认为这是因为它更快,但是您可以肯定地对其进行测试。 More information about pyrDown and pyrUp in this link.

    关于 cv::resize 算法,这里是列表:

    INTER_NEAREST - a nearest-neighbor interpolation
    INTER_LINEAR - a bilinear interpolation (used by default)
    INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
    INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood
    INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood
    

    不能确定 INTER_LINEAR 是否是所有这些中最快的,但它肯定比 INTER_CUBIC 快。

    【讨论】:

    • 其实对我来说,INTER_NEAREST是最快的
    【解决方案2】:

    INTER_NEAREST 速度最快,结果质量最差。在缩小范围内,对于每个像素,它只使用离假设位置最近的像素。

    INTER_LINEAR 是性能和质量的良好折衷,但比 INTER_NEAREST 慢。

    INTER_CUBIC 比 INTER_LINEAR 慢,因为它使用更多插值。

    INTER_LANCZOS4 是结果质量最好的算法,但比其他算法慢。

    在这里你可以找到很好的对比文章:http://tanbakuchi.com/posts/comparison-of-openv-interpolation-algorithms/

    【讨论】:

    【解决方案3】:

    在 4 核 CPU(不是 GPU)上进行计时。

    来自:(1440, 2560, 3) 至:(300, 300, 3)

    从最快到最慢:

    INTER_NEAREST resize:  Time Taken: 0:00:00.001024
    INTER_LINEAR resize:   Time Taken: 0:00:00.004321
    INTER_CUBIC resize:    Time Taken: 0:00:00.007929
    INTER_LANCZOS4 resize: Time Taken: 0:00:00.021042
    INTER_AREA resize:     Time Taken: 0:00:00.065569
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-05
      • 2021-09-03
      • 2016-09-28
      • 2020-02-08
      • 2012-07-17
      • 2011-11-07
      • 2015-08-24
      • 2013-08-06
      相关资源
      最近更新 更多