为什么cv :: resize太慢?

我正在做一个实时video源的边缘检测:

- (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做了一些相当繁重的工作,并且以1280×720的video帧大小运行在相当低的帧率上。 增加resize调用大大降低了帧率,与我所期望的相反。 这只是因为resize操作缓慢,或者因为我做错了什么?

smallImage在头文件中声明:

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

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

调整图像大小的速度很慢,并且每个处理的帧都要做两次。 有几种方法可以改进您的解决scheme,但是您必须提供有关您正在尝试解决的问题的更多详细信息。

首先,在检测边缘之前调整图像的大小会导致用较less的信息来提供边缘检测,这样会导致检测到较less的边缘,或者至less会使检测更难。

另外resize的algorithm影响它的速度,如果我的内存没有失败, CV_INTER_LINEAR是 cv :: resize 最快的 ,而且你正在使用CV_INTER_CUBIC作为第一个resize。

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

如果你真的想要调整图像的大小,opencv开发者通常使用pyrDownpyrUp函数来处理较小的图像,而不是resize 。 我认为这是因为速度更快,但是你可以testing一下。 有关pyrDown和pyrUp的更多信息,请点击此链接。

关于cv :: resizealgorithm,这里是列表:

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