CV_8U和CV_32F之间有什么区别,在它们之间转换时我应该担心什么
What are the differences between CV_8U and CV_32F and what should I worry about when converting between them?
我有一些代码出了问题,我怀疑这是因为我在错误的数据类型上操作或在它们之间转换得很差。
它混合了CV_8U
类型的cv::Mat
对象(这是在用cv::imread
读取jpg为灰度时创建的),CV_32F
和CV_32S
。
这些数据类型之间的区别是什么?在它们之间转换时我需要确保什么?
CV_8U是无符号8位/像素-即一个像素可以有0-255的值,这是大多数图像和视频格式的正常范围。
CV_32F是float -像素可以有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
).
你必须记住的是,你不能只是把它们从一个转换到另一个(否则它可能不会做你想要的),特别是在不同大小的类型之间。
所以一定要确保使用真正的转换函数在它们之间进行转换,比如cv::convert
或cv::Mat::convertTo
。不要只是尝试使用cv::Mat::at<float>
或cv::Mat_<float>
来访问CV_8U
类型的cv::Mat
元素。
或者,如果您只想转换单个元素,而不想创建其他类型的新矩阵,则使用适当的函数(在示例中为cv::Mat::at<unsigned char>
)访问元素并将结果转换为float
。
同样,组件的数量也存在差异,CV_8UC3
类型的cv::Mat
与CV_8UC1
类型的图像不同,通常不应该由cv::Mat::at<unsigned char>
访问,而应该由cv::Mat::at<cv::Vec3b>
访问。
编辑:看到Martin的回答,你可能已经意识到这一切,他的解释更符合你一直在寻找的
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- cv::Mat::t () 和 cv::transpose() 之间的区别
- 在CV :: MAT和Qimage之间进行转换会使程序崩溃
- 在uchar类型的特征::矩阵和cv::Mat之间的转换
- 计算 2 点之间的距离 打开CV C++
- 在不同的进程之间传输cv::Mat对象的最佳方式是什么
- 在指针类型之间转换的规则,其中cv限定符是唯一的区别
- 在表格之间传递cv::Mat
- cv::Mat和XnDepthPixel之间的转换*
- 将cv::Mat之间的矩阵转换为Eigen:: matrix和