OpenCV convertTo()

4
我发现了这段代码:
image.convertTo(temp_image,CV_16SC3);

我看到了从这里的convertTo()函数的描述,但是让我困惑的是image。我们如何阅读上述代码?imagetemp_image之间会有什么关系呢?
谢谢。
3个回答

11

这里的其他回答是正确的,但缺少一些细节。让我来试试。

image.convertTo(temp_image,CV_16SC3);

你有一个名为image图像,和一个名为temp_image目标图像。你没有指定image的类型,但它可能是CV_8UC3或者CV_32FC3,也就是一个有三个通道的图像(因为convertTo函数不改变通道数),每个通道深度为8位(unsigned char,CV_8UC3)或32位(float,CV_32FC3)。

这行代码将会改变每个通道的深度,使得temp_image的每个通道都是16位深度(short)。具体来说,是有符号短整型signed short,因为类型标识符中有S:CV_16SC3。

需要注意的是,如果你从float转换到signed short,也就是减少深度,那么saturate_cast函数将确保temp_image中的所有值都在正确的范围内,即对于signed short来说是[–32768, 32767]。

为什么需要改变图像的深度?

  1. 某些OpenCV函数需要特定深度的输入图像。
  2. 你需要一个矩阵来保存不同范围的值。例如,如果你需要对一些CV_8UC3(通常是BGR图像)进行求和(或相减),最好将结果存储在CV_16SC3中,否则由于饱和可能会得到错误的结果,因为CV_8U图像的范围是[0,255]。
  3. 你使用imread读取或者imwrite存储16位深度的图像。这通常用于医学或图形应用程序,以允许更广泛的颜色范围。然而,大多数显示器不支持16位图像可视化。
  4. 可能还有其他情况,请告诉我是否遗漏了重要的情况。

保存这个答案!太棒了。 - asdf

2
一幅图像是由像素信息构成的矩阵(例如,一个 1080p 图像将会是一个 1,920 × 1,080 的矩阵,每个条目都包含该像素的 rbg 值)。你所做的就是重新格式化该矩阵(每个像素条目,迭代地)为一种新类型 (CV_16SC3),以便可以被不同的程序读取。

temp_image 是基于 image 格式化为 CV_16SC3 的新像素信息矩阵。


@Miki,啊,是的,我的错,正在更新。 - asdf

0
第一个是,第二个是目标。因此,它将图像转换为CV_16SC3类型并存储在temp_image中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接