2015-09-17 37 views
1

我遇到了这个代码:的OpenCV的ConvertTo()

image.convertTo(temp_image,CV_16SC3); 

我看到的ConvertTo()函数的说明从here,但什么混淆我是image。我们如何阅读上面的代码? imagetemp_image之间的关系是什么?

谢谢。

回答

1

第一个是,第二个 - 目的地。所以,它需要镜像,将其转换为类型CV_16SC3并存储在temp_image中。

2

图像是像素信息的矩阵(即,1080p图像将是1,920 × 1,080矩阵,其中每个条目包含该像素的rbg值)。您所做的只是将该矩阵(每个像素条目,迭代地)重新格式化为一个新类型(CV_16SC3),以便它可以被不同的程序读取。

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

+0

@Miki,啊是的,我的坏,更新 – asdf

3

这里的其他答案是正确的,但缺乏一些细节。让我尝试。

image.convertTo(temp_image,CV_16SC3); 

你有图像0​​和目的地图像0​​。未指定的image类型,但大概是CV_8UC3CV_32FC3,即,3通道图像(因为convertTo不改变信道的数量),其中,每个信道具有深度为8位(unsigned char,CV_ 8U C3 )或32位(float,CV_ 32F C3)。

这行代码会改变每个通道的深度,因此temp_image的每个通道的深度为16位(short)。特别是它是signed short,因为类型说明符有S:CV_16 S C3。

请注意,如果您正在缩小的深度,如从floatsigned short的话,那么saturate_cast将确保在temp_image所有值将在正确的范围内,即[-32768,32767]为signed short

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

  1. 某些OpenCV功能需要具有特定深度的输入图像。
  2. 您需要一个矩阵来包含不同范围的值。例如。如果您需要总结(或减去)一些图像CV_8UC3(最终BGR图像),则最好将结果存储在CV_16SC3中,否则由于饱和度可能会得到错误结果,因为CV_8U图像的范围是[0,255 ]
  3. 您使用imread阅读,或想与imwrite存储16位深度的图像。这通常用于医疗或图形应用(AFAIK),以允许更广泛的颜色。但是,大多数显示器不支持16位图像可视化。
  4. 有可能是其他情况,让我知道如果我错过了一个重要的你。
+0

保存此答案!太棒了 – asdf

+0

@asdf谢谢! :d – Miki