在CV_8U和CV_32F之间有什么区别,我在转换它们时应该担心什么?

我有一些代码正在发挥作用,我怀疑这是因为我正在操作错误的数据types或差的转换。

它将cv::Mattypes的CV_8U (这是在用cv::imread读取一个jpg时创build的) cv::Mat对象, CV_32FCV_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_8Utypes的cv::Mat的元素。

或者如果你只是想转换单个元素,而不想创build另一个types的新matrix,可以使用相应的函数(例如cv::Mat::at<unsigned char> )来访问元素,并将导致float

同样,组件的数量也有差异, CV_8UC3types的cv::MatCV_8UC3types的图像不同,应该(通常)不能被cv::Mat::at<unsigned char> ,但是通过cv::Mat::at<cv::Vec3b>

编辑:看到马丁的答案可能是,你知道这一切,他的解释更是你一直在寻找。