【问题标题】:OpenCV convert to smaller data type: Max, or truncate/overflow?OpenCV 转换为更小的数据类型:Max,还是截断/溢出?
【发布时间】:2014-07-18 14:11:49
【问题描述】:
对于我正在处理的项目,我需要通过带通滤波器传递视频缓冲区。带通滤波器包括 FFT 和 IFFT,以及通带外频率的平坦化。为了实现这一点,我需要有比标准 uchar 类型更多的空间来存储值,所以我暂时将我的视频帧转换为 CV_64F,并计划将它们转换回 CV_8UC3。这是我的问题:
将 cv::Mat 数据从大数据类型转换为较小数据类型时,OpenCV 的行为是什么?更具体地说,如果我在 cv::Mat 对象中的 CV_64F 数据值大于 CV_8U 中单个数据点的最大可能值,OpenCV 是否将目标数据设置为该数据类型的最大可能值,或者我们有溢出或截断问题吗?
【问题讨论】:
标签:
opencv
type-conversion
【解决方案1】:
刚刚写了一个简单的程序来弄清楚它是如何工作的:
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
int main() {
cv::Mat img1(cv::Size(2,2), CV_64F);
img1 = cv::Scalar(5000000);
cv::Mat img2;
img1.convertTo(img2, CV_8U);
for(int i = 0; i < img2.rows; i++) {
for(int j = 0; j < img2.cols; j++) {
unsigned char tmp = img2.at<uchar>(i, j);
cout << (int)tmp << endl;
}
}
return 0;
}
用pkg-config --cflags --libs opencv 编译并运行它。 4 行的输出为 255。
结论:OpenCV在从较大的数据类型转换为较小的数据类型时,如果源数据是较大的值,会将较小的数据类型值设置为可能的最大值。也就是说,大于 unsigned char 的最大值的 500,000 值在转换为 CV_8U 时将设置为 255。