【问题标题】: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。

    【讨论】:

      猜你喜欢
      • 2016-08-06
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多