OpenCV 转换为()

Posted

技术标签:

【中文标题】OpenCV 转换为()【英文标题】:OpenCV convertTo() 【发布时间】:2015-09-17 20:59:54 【问题描述】:

我遇到了这段代码:

image.convertTo(temp_image,CV_16SC3);

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

谢谢。

【问题讨论】:

【参考方案1】:

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

image.convertTo(temp_image,CV_16SC3);

您有一个图像image,和一个目标图像temp_image。您没有指定image 的类型,但可能是CV_8UC3CV_32FC3,即3 通道图像(因为convertTo 不会更改通道数),其中每个通道的深度为8 位(unsigned char, CV_8UC3) 或 32 位 (float, CV_32FC3)。

这行代码会改变每个通道的深度,使temp_image的每个通道的深度为16位(short)。具体来说,它是 signed short,因为类型说明符具有 S:CV_16SC3。

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

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

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

【讨论】:

保存这个答案!太棒了【参考方案2】:

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

temp_image 是一个基于image 的新像素信息矩阵,格式为CV_16SC3

【讨论】:

@Miki,是的,我的错,正在更新【参考方案3】:

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

【讨论】:

以上是关于OpenCV 转换为()的主要内容,如果未能解决你的问题,请参考以下文章

将 c++ opencv IplImage imageData 和 widthStep 转换为 android opencv Mat

将 ReadTensorFromImageFile 转换为 opencv 格式

在 OpenCV 中将图像转换为彩色铅笔素描

将 Numpy 数组转换为 OpenCV 数组

使用opencv将图像从BGR转换为ARGB

opencv:将 Mat 转换为 IplImage 问题