您好我需要快速缩放灰度图像,所以我尝试了vImage并且应用程序崩溃了,请帮忙。在下面的代码中,srcimg.data/dstimg.data指向无符号字符图像数据(仅限单通道灰色数据)。
vImage_Buffer src; src.data=srcimg.data; src.height=srcimg.cols; src.width=srcimg.rows; src.rowBytes=srcimg.cols; vImage_Buffer dest; dest.data=dstimg.data; dest.height=dstimg.cols; dest.width=dstimg.rows; dest.rowBytes=dstimg.cols; vImageScale_Planar8(&src, &dest, NULL, kvImageNoFlags);
答案 0 :(得分:2)
对于vImage / Geometry.h中的重采样API,我们选择使用向量单元来提供更好的质量而不是更快的速度。这是因为向量单元在内存中进行分散访问时通常很差,这很大程度上是因为线性或最近邻重采样与非单位步长的简单操作。他们似乎并不擅长使最近邻居或线性过滤变得更快。所以,我们转而使用Lanczos过滤,它会查看更大的连续像素区域,以找出每个结果像素。它看起来很棒(我认为),但是更加努力才能获得令人敬畏的效果。
此外,如果你想要的只是线性或最近邻滤波,那么GPU就有硬件了!
通常,vImage中的API旨在为您提供比滚动自己更快的结果。
答案 1 :(得分:1)
cv::resize
默认使用线性插值。 vImageScale_Planar8
使用Lanczos resampling,这更复杂,但也提供了更好的质量。你要比较苹果和橘子。
答案 2 :(得分:0)
首先,只是一个评论:通常高度是行,宽度列 - 它看起来很奇怪你使用它。
您是否为目标图像设置了内存:
dstimg.data = malloc(dstimg.cols * dstimg.rows);
您将部署目标设置为ios5还是更新?
我在iOS5上使用了Accelerate框架没有任何问题。