为什么cv :: resize这么慢?

fre*_*ley 10 opencv image-processing objective-c ios

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

- (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);
}
Run Code Online (Sandbox Code Playgroud)

edgeDetection做了一些相当沉重的提升,并且运行在相当低的帧速率,视频帧大小为1280x720.添加resize调用会大大降低帧速率,与我期望的完全相反.这只是因为调整大小操作很慢,或者因为我做错了什么?

smallImage 因此在标题中声明:

@interface CameraController : UIViewController
<CvVideoCameraDelegate>
{
    Mat smallImage;
}
Run Code Online (Sandbox Code Playgroud)

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

Rui*_*ues 18

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

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

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

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

如果你真的想调整图像的大小,opencv开发人员通常会在想要处理较小的图像时使用pyrDownpyrUp函数,而不是调整大小.我认为这是因为它更快,但你可以测试它是肯定的.有关此链接中的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
Run Code Online (Sandbox Code Playgroud)

不能确定INTER_LINEAR是否是最快的,但肯定比INTER_CUBIC更快.

  • 实际上,对我来说,__ INTER\_NEAREST__是最快的 (5认同)

小智 9

INTER_NEAREST 速度最快,质量最差。在缩小比例中,对于每个像素,它只使用离假设位置最近的像素。

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

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

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

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