我正在对实时视频源进行边缘检测:
- (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;
}
它没有初始化,工作正常。
调整图像的大小很慢,每个处理的帧要调整两次。有几种方法可以以某种方式改进您的解决方案,但您必须提供有关您试图解决的问题的更多详细信息。
首先,在检测边缘之前调整图像的大小将导致边缘检测提供更少的信息,从而导致检测到的边缘更少,或者至少会使检测变得更加困难。
此外,所使用的调整大小算法也会影响其速度,CV_INTER_LINEAR是CV::如果我的内存没有故障,则调整大小最快的,并且您正在使用CV_INTER_CUBIC进行第一次调整大小。
调整图像大小的替代方案是处理原始图像的较小区域。为此,您应该查看opencv图像ROI(感兴趣的区域)。这很容易做到,你在这个网站上有很多关于这些的问题。缺点是,您将只检测一个区域中的边缘,而不是整个图像的边缘,这可能很好,具体取决于问题。
如果您真的想调整图像的大小,opencv开发人员通常在处理较小的图像时使用pyrDown和pyrUp函数,而不是调整大小。我认为这是因为它更快,但你可以测试它以确定。有关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快。
INTER_NEAEST是速度最快、质量最差的结果。在缩小比例中,对于每个像素,它只使用离假设位置最近的像素。
INTER_LINEAR是性能和质量的一个很好的折衷方案,但它比INTER_NEAEST慢。
INTER_CUBIC比INTER_LINEAR慢,因为它使用了更多的插值。
INTER_LANCZOS4是质量最好的算法,但它比其他算法慢。
在这里你可以找到一篇很好的对比文章:http://tanbakuchi.com/posts/comparison-of-openv-interpolation-algorithms/
4核CPU(非GPU)的时间试用。
发件人:(14402560,3)收件人:(3003003)
最快到最慢:
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