我正在使用其中一个nppiWarpPerspectiveBack
CUDA nVidia Performance Primitives (NPP)函数来透视图像,我想知道当源图像被采样超出其边界时会发生什么(或超出源ROI)。
例如,以下代码通过根据3x3透视矩阵对源图像进行采样来创建目标图像:
const NppiSize Size = {W, H};
const NppiRect ROI = {0,0, W,H};
nppiWarpPerspectiveBack_8u_C3R( // 8-bit, 3-channel images
srcImagePtr, Size, srcPitch, ROI,
dstImagePtr, dstPitch, ROI,
transformMatrix,
NPPI_INTER_LINEAR);
这里的源图像和目标图像的大小都是WxH,但是得到的扭曲输入图像(在我的情况下)小于目标图像,因此像素将在源的ROI之外采样。
documentation非常稀疏,但它在第4.6.2.3节
中说明如下一般的NPP原语和NPP邻域操作 特别要求所有读取和写入的像素位置都有效 并在各自图像的边界内。在外面采样 定义的图像数据区域导致未定义的行为和 可能导致系统不稳定。
我假设源ROI阻止了"未定义的行为"通过剪切源图像外的样本。来自第7.76.1节:
如果源像素小数x和y坐标大于或 等于oSizeROI.x并且小于oSizeROI.x + oSizeROI.width和 大于或等于oSizeROI.y且小于oSizeROI.y + oSize- ROI.height然后源像素被认为是在源内 图像剪辑矩形和源图像被采样。否则 未对源图像进行采样,并且不写入目标像素 目的地形象。
在越界像素的实践中,似乎我得到了目标图像中的帧缓冲区中发生的任何随机垃圾(例如,如果目标图像最初是黑色则我变黑)。我希望它是黑色(或一些恒定的颜色),但我想非常确定我正在避免未定义的行为及其相关系统的不稳定性。
(顺便说一句,我认为上述文档中的oSizeROI
是错误的,应该是oSrcROI
,这是源图像的投资回报率。)
有谁知道这里的确定行为是什么?我安全吗?