2

嗨,我需要快速缩放灰度图像,所以我尝试了 vImage 并且应用程序崩溃了,请帮忙。在下面的代码中 srcimg.data/dstimg.data 是指向无符号字符图像数据的点(仅单通道灰度数据)。

                    vImage_Buffer 源;
                    src.data=srcimg.data;
                    src.height=srcimg.cols;
                    src.width=srcimg.rows;
                    src.rowBytes=srcimg.cols;

                    vImage_Buffer 目标;
                    dest.data=dstimg.data;
                    dest.height=dstimg.cols;
                    dest.width=dstimg.rows;
                    dest.rowBytes=dstimg.cols;
                    vImageScale_Planar8(&src, &dest, NULL, kvImageNoFlags);

4

3 回答 3

2

对于 vImage/Geometry.h 中的重采样 API,我们选择使用矢量单元来提供更好的质量而不是更快的速度。这是因为向量单元通常在内存中进行分散访问方面非常糟糕,这主要是您为简单的事情所做的事情,例如线性或最近邻重采样与非单元步幅。他们似乎并不擅长使最近邻或线性过滤快速进行。因此,我们改为使用 Lanczos 过滤,它查看更大的连续像素区域以找出每个结果像素。它看起来很棒(我认为),但要获得令人敬畏的效果需要更多的工作。

此外,如果您想要的只是线性或最近邻过滤,那么 GPU 有硬件来解决这个问题!

确实,通常 vImage 中的 API 旨在为您提供比滚动自己更快的结果。

于 2012-10-03T00:22:58.990 回答
1

cv::resize默认使用线性插值。 vImageScale_Planar8使用Lanczos 重采样,它更复杂,但也提供了明显更好的质量。你在比较苹果和橘子。

于 2012-07-25T16:22:24.310 回答
0

首先,只是一个评论:通常高度是行,宽度是列——你使用它的方式看起来很奇怪。

您是否为目标图像分配了内存:

dstimg.data = malloc(dstimg.cols * dstimg.rows);

您将部署目标设置为 ios5 或更高版本?

我在 iOS5 上使用了 Accelerate 框架,没有任何问题。

于 2012-07-24T11:49:41.623 回答