OpenCV convertTo()

时间:2015-09-17 20:59:54

标签: c++ opencv

我遇到了这段代码:

image.convertTo(temp_image,CV_16SC3);

我从here看到了convertTo()函数的描述,但令我困惑的是image。我们怎样才能阅读上面的代码? imagetemp_image之间的关系是什么?

感谢。

3 个答案:

答案 0 :(得分:3)

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

image.convertTo(temp_image,CV_16SC3);

您有来源图片image目的地图片temp_image。您没有指定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中的所有值都将在signed short的[-32768,32767]范围内。

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

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

答案 1 :(得分:2)

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

temp_image是基于格式化为image的{​​{1}}的新像素信息矩阵。

答案 2 :(得分:0)

第一个是来源,第二个是目的地。因此,它需要图像,将其转换为CV_16SC3类型并存储在temp_image中。