c++ - Visual Studio 发布和调试区别

标签 c++ opencv floating-point release-mode debug-mode

我正在编写一个代码,我在其中读取、成像和处理它并得到一个 Mat of double/float .我将它保存到一个文件中,稍后,我从该文件中读取它。

当我使用 double 时,1Kx1K 图像需要 8MB 的空间,当我使用 float 时它需要 4MB。所以我想用 float .

这是我的代码和输出:

Mat data = readFloatFile("file_location");
cout << data.at<float>(0,0) << "   " <<  data.at<double>(0,0);

当我在 DEBUG mode 中运行这段代码时, float 的打印输出是 -0double 给出异常(exception)即 assertion failed 。但是当我使用 RELEASE mode float 的打印输出是 -0 0.832 为 double,这是真实值

我的问题是为什么我在使用 data.at<float>(0,0) 时无法获得输出以及为什么我在使用 data.at<double>(0,0) in RELEASE mode 时没有出现异常应该是这样吗?

编辑:这是我编写和读取的代码

void writeNoiseFloat(string imageName,string fingerprintname) throw(){

    Mat noise = getNoise(imageName);

    FILE* fp = fopen(fingerprintname.c_str(),"wb");
    if (!fp){
        cout << "not found ";
        perror("fopen");
    }
    float *buffer = new float[noise.cols];
    for(int i=0;i<noise.rows;++i){
        for(int j=0;j<noise.cols;++j)
            buffer[j]=noise.at<float>(i,j);     
        fwrite(buffer,sizeof(float),noise.cols,fp);
    }

    fclose(fp);
    free(buffer);
}   

void readNoiseFloat(string fpath,Mat& data){
    clock_t start = clock();
    cout << fpath << endl;
    FILE* fp = fopen(fpath.c_str(),"rb");
    if (!fp)perror("fopen");
    int size = 1024;
    data.create(size,size,CV_32F);

    float* buffer= new float[size];
    for(int i=0;i<size;++i)   {
        fread(buffer,sizeof(float),size,fp);
        for(int j=0;j<size;++j){
            data.at<float>(i,j)=buffer[j];
            cout << data.at<float>(i,j) << " " ;
            cout << data.at<double>(i,j);
        }
    }
    fclose(fp);
}

提前致谢

最佳答案

首先,你不能使用floatdouble在一个cv::Mat因为存储本身只是字节数组。对于 float 的矩阵,此数组的大小将不同和 double 的矩阵.

因此,您必须决定使用什么。

本质上,data.at<type>(x,y)相当于(type*)data_ptr[x][y] (注意这不是确切的代码,它的目的是展示正在发生的事情)

编辑: 根据您添加的代码,您正在创建 CV_32F 的矩阵这意味着您必须使用 float写和读和元素。使用 double 会导致重新解释值,并且肯定会给您一个不正确的结果。

关于断言,我确信在cv::MAT::at<class T>里面有一种如下代码:

assert(sizeof<T>==this.getDepth());

通常断言仅在 DEBUG 中编译模式,所以这就是为什么你不在 RELEASE 中给出这个错误.

编辑 2: 不考虑问题,但永远不要使用 free()newdeletemalloc() .结果可能是一个难以调试的问题。

所以请使用delete[]用于缓冲。

关于c++ - Visual Studio 发布和调试区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19565788/

相关文章:

c++ - 如何在 C++ 中添加两个大的 double

c++ - C++中构造函数的默认访问是什么

c++ - 禁用 rtti 的后果?

python - 在 OpenCV 和 Python 中与多个源图像进行模板匹配

image-processing - 使用 OpenCV Haar 级联分类器查找形状

Opencv 无法访问通过视频捕获设备连接的摄像头

c++ - 将数据 float 到 uint8_t 和 memcpy ,返回 null

c++ - 不同进程数的不同浮点答案

c++ - 当底层文件取消链接时,fstream 对象会发生什么?

c++ - 如何使我的 C++ 库符合 IEEE 754