为什么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开发者通常使用pyrDown和pyrUp函数来处理较小的图像,而不是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快。