我有一些正在起作用的代码,我怀疑这是因为我正在使用错误类型的数据或在它们之间进行转换效果不佳。
正在混合cv::Mat
类型CV_8U
对象(这是在将jpg作为带有cv::imread
的灰度级时创建的),CV_32F
和{{1} }。
这些数据类型之间有什么区别,在转换它们时需要确定什么?
答案 0 :(得分:85)
CV_8U是无符号8位/像素 - 即一个像素的值可以是0-255,这是大多数图像和视频格式的正常范围。
CV_32F是浮点数 - 像素可以有0到1.0之间的任何值,这对于数据的某些计算集非常有用 - 但必须通过将每个像素乘以255来将其转换为8位以进行保存或显示。 p>
CV_32S是每个像素的带符号32位整数值 - 再次对像素进行整数数学运算很有用,但需要转换为8位才能保存或显示。这比较棘手,因为您需要决定如何将更大范围的可能值(+/- 20亿!)转换为0-255
答案 1 :(得分:63)
基本上他们只描述了各个组成部分:
CV_8U
:1字节无符号整数(unsigned char
)。
CV_32S
:4字节有符号整数(int
)。
CV_32F
:4字节浮点(float
)。
你必须要记住的是,你不能只将它们从一个投射到另一个(或者它可能不会做你想要的),特别是在不同大小的类型之间。
因此,请始终确保使用真实的转换函数进行转换,例如cv::convert
或cv::Mat::convertTo
。不要只是试图访问例如使用例如cv::Mat
CV_8U
类型的cv::Mat::at<float>
cv::Mat_<float>
或cv::Mat::at<unsigned char>
。
或者,如果您只想转换单个元素并且不想创建其他类型的新矩阵,请使用适当的函数访问元素(在示例float
中)并将结果转换为{ {1}}。
同样,组件数量之间也存在差异,cv::Mat
类型的CV_8UC3
与CV_8UC1
类型的图像不同,{应该(通常)不应该{ {1}},但是cv::Mat::at<unsigned char>
。
编辑:看到马丁的回答可能是你知道这一切,他的解释更多是你一直在寻找的。 p>