OpenCV 转换为更小的数据类型 : Max, 或截断/溢出?

标签 opencv type-conversion

对于我正在进行的项目,我需要通过带通滤波器传递视频缓冲区。带通滤波器包括 FFT 和 IFFT,以及通带外频率的平坦化。为了实现这一点,我需要有比标准 uchar 类型可用的更多空间来存储值,因此我暂时将我的视频帧转换为 CV_64F,并计划将它们转换回 CV_8UC3。这是我的问题:

将 cv::Mat 数据从大数据类型转换为小数据类型时,OpenCV 的行为是什么?更具体地说,如果我在具有 CV_64F 数据的 cv::Mat 对象中的值大于 CV_8U 中单个数据点的最大可能值,OpenCV 是否将目标数据设置为该数据类型的最大可能值,或者我们有溢出或截断问题吗?

最佳答案

只是写了一个简单的程序来弄清楚它是如何工作的:

#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;
}

<code>pkg-config --cflags --libs opencv</code> 编译它并运行它。 4 行输出为 255。

结论:当从较大的数据类型转换为较小的数据类型时,如果源数据是较大的值,OpenCV 会将较小的数据类型值设置为最大可能值。换句话说,大于 unsigned char 最大值的值 500,000 在转换为 CV_8U 时将设置为 255。

关于OpenCV 转换为更小的数据类型 : Max, 或截断/溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24816665/

相关文章:

java - 为什么图像的大小是0 x 0

python - cv2.VideoCapture 无法在 Mac 主机上的 docker 容器中工作

opencv - 为什么OpenCV没有专门的区域数据结构?

python - OpenCV 3.1.0 : Finding the 3D position of a flat plane with known dimensions

php - 如何在 laravel Eloquent 中将 int 转换为字符串?

c - 如何将 `SInt16' 转换为 `double'?

c++ - 用户定义和标准转换

rust - 将位数转换为32位整数

matlab - 在Matlab中将标量打印为int32

python - 使用 python OpenCV 从 Kinect 设备检索 channel