13

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

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

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

4

3 回答 3

22

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

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

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

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

如果你真的想调整图像大小,opencv 开发人员在处理较小的图像时通常会使用pyrDownpyrUp函数,而不是resize。我认为这是因为它更快,但是您可以肯定地对其进行测试。此链接中有关 pyrDown 和 pyrUp 的更多信息。

关于 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快。

于 2013-02-13T21:08:08.437 回答
11

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

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

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

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

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

于 2018-07-18T14:12:15.120 回答
0

在 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
于 2022-02-17T07:59:52.293 回答