`cv::convertMaps` 的“压缩形式”是如何工作的?

问题描述 投票:0回答:2

convertMaps

文档
表示它支持以下转换:

(CV_32FC1, CV_32FC1)→(CV_16SC2, CV_16UC1)
这是最常用的转换操作,其中原始浮点映射(参见
remap
)被转换为更紧凑且更快的定点表示。第一个输出数组包含舍入坐标,第二个数组(仅在
nninterpolation=false
时创建)包含插值表中的索引。

我知道

(CV_32FC1, CV_32FC1)
(x, y)
坐标编码为浮点数。定点格式如何工作?
CV_16SC2
矩阵的每个 2 通道条目中编码了什么?
CV_16UC1
矩阵索引到哪些插值表?

opencv interpolation
2个回答
3
投票

我将根据我上次调查此问题时所记得的内容进行。一粒盐等等。

定点格式将 (x,y) 坐标的整数和小数部分拆分为不同的映射。

它是“紧凑”的,因为

CV_32FC2
或 2x
CV_32FC1
每个像素使用 8 个字节,而
CV_16SC2 + CV_16UC1
每个像素使用 6 个字节。而且它仅是整数,因此使用它可以释放浮点计算资源以用于其他工作。

整数部分进入第一个映射,该映射是 2 通道的。没有什么惊喜。

小数部分被转换为 5 位整数,即它们乘以 32。然后它们被打包在一起,最低 5 位来自一个坐标,接下来的高 5 位来自另一个坐标。

生成的有趣数字的范围为

0 .. 1023
0b00000_00000 .. 0b11111_11111
,分别编码小数部分 (0.0, 0.0) 和 (0.96875, 0.96875)(即 31/32)。

重映射期间...

整数映射用于为每个结果像素查找源图像中插值所需的几个像素。

分数图被视为 OpenCV 内部“插值表”的索引。它包含将多个采样像素正确混合为一个结果像素所需的任何因素和移位,所有这些都使用整数数学。我猜有多个表,每个表对应一种插值方法(线性、三次……)。


0
投票

那真是太棒了。在 remap() 中,插值是使用多个表完成的,每个表对应一种插值方法,如线性、三次。我的问题是,我在哪里可以找到你所说的 OpenCV 内部的“插值表”? 谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.