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

mic*_*mic 48 c++ opencv

我有一些代码正在起作用,我怀疑这是因为我在错误的数据类型上操作或者在它们之间进行转换很差.

它混合cv::Mat了类型的对象CV_8U(这是在将jpg作为灰度级读取时创建的cv::imread)CV_32F,和CV_32S.

这些数据类型之间有什么区别,在它们之间进行转换时需要确定什么?

Mar*_*ett 90

CV_8U是无符号8位/像素 - 即一个像素的值可以是0-255,这是大多数图像和视频格式的正常范围.

CV_32F是浮点数 - 像素可以具有0-1.0之间的任何值,这对于数据的某些计算集很有用 - 但它必须转换为8位以通过将每个像素乘以255来保存或显示.

CV_32S是每个像素的带符号32位整数值 - 再次对像素进行整数数学运算很有用,但需要转换为8位才能保存或显示.这比较棘手,因为您需要决定如何将更大范围的可能值(+/- 20亿!)转换为0-255

  • 这个回复中的数据范围特别有用,在文档中找不到这个! (4认同)
  • 浮点像素的0-1范围更像是一种约定,但opencv在其所有函数中都假设它 (4认同)

Chr*_*ica 65

基本上他们只是描述了各个组件是什么:

  • CV_8U:1字节无符号整数(unsigned char).

  • CV_32S:4字节有符号整数(int).

  • CV_32F:4字节浮点(float).

你必须要记住的是,你不能只将它们从一个投射到另一个(或者它可能不会做你想要的),特别是在不同大小的类型之间.

因此,请始终确保使用实际转换函数在它们之间进行转换,例如cv::convertcv::Mat::convertTo.不要只尝试访问的例如元素cv::MatCV_8U使用如类型cv::Mat::at<float>cv::Mat_<float>.

或者,如果您只想转换单个元素并且不想创建其他类型的新矩阵,请使用适当的函数(在示例中cv::Mat::at<unsigned char>)访问元素并将结果转换为float.

同样,组件数量之间也存在差异cv::Mat,CV_8UC3类型的CV_8UC1类型与类型的图像不同,并且应该(通常)不被访问cv::Mat::at<unsigned char>,而是通过cv::Mat::at<cv::Vec3b>.

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