为什么cv :: resize这么慢?

时间:2013-02-13 11:46:46

标签: ios objective-c opencv image-processing

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

- (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;
}

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

2 个答案:

答案 0 :(得分:17)

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

首先,在检测边缘之前调整图像大小将导致边缘检测的信息量减少,从而导致检测到边缘较少 - 或者至少会使检测边缘变得更难。

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

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

如果你真的想要调整图像大小,opencv开发人员通常会在想要处理较小图像时使用 pyrDown pyrUp 函数,而不是调整大小< / strong>即可。我认为这是因为它更快,但你可以测试它是肯定的。 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 更快。

答案 1 :(得分:1)

INTER_NEAREST是最快的,并且质量最差。在缩小比例中,对于每个像素,它仅使用最接近假设位置的像素。

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

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

INTER_LANCZOS4是质量最高的算法,但比其他算法要慢。

在这里您可以找到一篇不错的比较文章:http://tanbakuchi.com/posts/comparison-of-openv-interpolation-algorithms/