在CV_8U和CV_32F之间有什么区别,我在转换它们时应该担心什么?
我有一些代码正在发挥作用,我怀疑这是因为我正在操作错误的数据types或差的转换。
它将cv::Mat
types的CV_8U
(这是在用cv::imread
读取一个jpg时创build的) cv::Mat
对象, CV_32F
和CV_32S
。
这些数据types之间有什么区别,在转换它们之间需要确定什么?
CV_8U是无符号8位/像素 – 即一个像素可以有0-255的值,这是大多数图像和video格式的正常范围。
CV_32F是浮点数 – 像素可以具有0-1.0之间的任何值,这对于数据的一些计算集合是有用的 – 但是它必须被转换成8位来保存或通过将每个像素乘以255来显示。
CV_32S是每个像素的有符号32位整数值 – 同样对像素进行整数运算,但是又需要转换为8位来保存或显示。 这是比较棘手的,因为您需要决定如何将可能值(+/- 20亿!)的大范围转换为0-255
基本上他们只是描述各个组件是什么:
-
CV_8U
:1字节无符号整数(unsigned char
)。 -
CV_32S
:4字节有符号整数(int
)。 -
CV_32F
:4字节浮点数(float
)。
你总是要记住的是,你不能把它们从一个转换到另一个(或者它可能不会做你想做的),特别是在不同大小的types之间。
所以一定要确保你使用真正的转换函数来转换它们,比如cv::convert
或者cv::Mat::convertTo
。 不要尝试使用例如cv::Mat::at<float>
或cv::Mat_<float>
访问CV_8U
types的cv::Mat
的元素。
或者如果你只是想转换单个元素,而不想创build另一个types的新matrix,可以使用相应的函数(例如cv::Mat::at<unsigned char>
)来访问元素,并将导致float
。
同样,组件的数量也有差异, CV_8UC3
types的cv::Mat
与CV_8UC3
types的图像不同,应该(通常)不能被cv::Mat::at<unsigned char>
,但是通过cv::Mat::at<cv::Vec3b>
。
编辑:看到马丁的答案可能是,你知道这一切,他的解释更是你一直在寻找。