OpenCV 转换为()
Posted
技术标签:
【中文标题】OpenCV 转换为()【英文标题】:OpenCV convertTo() 【发布时间】:2015-09-17 20:59:54 【问题描述】:我遇到了这段代码:
image.convertTo(temp_image,CV_16SC3);
我从here 看到了convertTo() 函数的描述,但让我感到困惑的是image
。我们如何阅读上面的代码? image
和 temp_image
之间的关系是什么?
谢谢。
【问题讨论】:
【参考方案1】:这里的其他答案是正确的,但缺少一些细节。让我试试。
image.convertTo(temp_image,CV_16SC3);
您有一个源图像image
,和一个目标图像temp_image
。您没有指定image
的类型,但可能是CV_8UC3
或CV_32FC3
,即3 通道图像(因为convertTo
不会更改通道数),其中每个通道的深度为8 位(unsigned char
, CV_8UC3) 或 32 位 (float
, CV_32FC3)。
这行代码会改变每个通道的深度,使temp_image
的每个通道的深度为16位(short
)。具体来说,它是 signed short
,因为类型说明符具有 S:CV_16SC3。
请注意,如果您要缩小深度,例如从float
到signed 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