我遇到了这段代码:
image.convertTo(temp_image,CV_16SC3);
我从here看到了convertTo()函数的描述,但令我困惑的是 image
。我们如何阅读上面的代码? image
和 temp_image
之间的关系是什么?
谢谢。
最佳答案
这里的其他答案是正确的,但缺少一些细节。让我试试。
image.convertTo(temp_image,CV_16SC3);
您有一个源图像image
,和一个目标图像temp_image
。您没有指定 image
的类型,但可能是 CV_8UC3
或 CV_32FC3
,即 3 channel 图像(因为 convertTo
不改变 channel 数),其中每个 channel 的深度为 8 位(unsigned char
, CV_8UC3)或 32 位(float
,CV_32FC3)。
这行代码会改变每个 channel 的深度,这样temp_image
的每个 channel 的深度都是16位(short
)。具体来说,它是一个signed short
,因为类型说明符有S:CV_16SC3。
请注意,如果您正在缩小深度,例如从 float
到 signed short
,那么 saturate_cast
将确保temp_image
中的所有值都将在正确的范围内,即 signed short
的 [–32768, 32767]。
为什么需要更改图像的深度?
- 一些 OpenCV 函数需要具有特定深度的输入图像。
- 您需要一个矩阵来包含不同范围的值。例如。如果你需要求和(或减去)一些图像 CV_8UC3(通常是 BGR 图像),你最好将结果存储在 CV_16SC3 中,否则你可能会因为饱和而得到错误的结果,因为 CV_8U 图像的范围在 [0,255 ]
- 您使用
imread
读取,或者想要使用imwrite
存储16 位深度的图像。这通常用于(AFAIK)医学或图形应用程序中以允许更广泛的颜色。但是,大多数显示器不支持 16 位图像可视化。 - 可能还有其他情况,如果我错过了对您重要的情况,请告诉我。
关于c++ - OpenCV 转换为(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32639883/