c++ - OpenCV 转换为()

标签 c++ opencv

我遇到了这段代码:

image.convertTo(temp_image,CV_16SC3);

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

谢谢。

最佳答案

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

image.convertTo(temp_image,CV_16SC3);

您有一个图像image,和一个目标图像temp_image。您没有指定 image 的类型,但可能是 CV_8UC3CV_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。

请注意,如果您正在缩小深度,例如从 floatsigned 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 位深度的图像。这通常用于(AFAIK)医学或图形应用程序中以允许更广泛的颜色。但是,大多数显示器不支持 16 位图像可视化。
  4. 可能还有其他情况,如果我错过了对您重要的情况,请告诉我。

关于c++ - OpenCV 转换为(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32639883/

相关文章:

c++ - iOS下OpenGL ES 2.0初始化

C++ Clang 发出有关未使用模板变量的警告

c++ - QSystemDeviceInfo 中成员的无效使用

python - opencv-python:不是一个numpy数组

algorithm - 如何在opencv中的平滑图像中插入孔洞?

java - src.type() == CV_8UC1 断言在校正图像时失败

c++ - 更改数组中元素的文本颜色

c++ - 指针地址给出 1 而不是十六进制地址

image - OpenCV:从文件夹中读取图像系列

c++ - Point2f vector 的最小值和最大值