在 opencv c++ 中保存多维矩阵

Saving multi-dimensional matrix in opencv c++

本文关键字:保存 opencv c++      更新时间:2023-10-16

我在 opencv, c++ 中创建了一个 3D 浮点矩阵,在他的答案中借助 brunocodutra。我的矩阵是 1024*1024*N(N 不是常数,可能会改变(

当我说const int N = some_number;我可以说

typedef Vec<float,N> VecNf;

在这个类型定义之后,我可以玩矩阵了。但是,我不希望 N 是恒定的,因此我被困在那里。我相信,应该有一些简单的解决方案,但我还找不到。

编辑:我添加了保存矩阵的代码。假设我正确创建了具有 100 个通道的 3D Mat noise

typedef Vec<float,100> Vec100f;
void writeNoise_ND(string filename,Mat noise) throw(){
    int chans = noise.channels();
    int sz = noise.rows;
    FILE* fp = fopen(filename.c_str(),"wb");
    if (!fp){
        perror("out directory is not foundn");
    }
    float *buffer = new float[sz];
    for(int c = 0; c < chans; c++){
        for(int i=0;i<sz;++i){
            for(int j=0;j<sz;++j)
                buffer[j]=noise.at<Vec100f>(i,j)[c];
            fwrite(buffer,sizeof(Vec100f),sz,fp);
        }
    }
    fclose(fp);
    free(buffer);   
}

有人可以指导我吗?如果已经问过问题,请后悔。

提前感谢,

您的垫子似乎是我认为的具有N个通道的2D垫子。 就像典型的图像是 2D Mat 3 通道 (RGB( 一样。 以下代码将存储所有通道 0,后跟所有通道 1 等,直到通道 N-1:

#include <fstream>
#include <vector>
void writeNoise(string filename, Mat noise)
{
    int chans = noise.channels();
    int sz = noise.rows;  // should check that noise.cols is == noise.rows
    std::ofstream f(filename, ios::out | ios::binary);
    if (!f.is_open())
        throw std::ofstream::failure("out directory is not foundn");
    std::vector<float> buffer(sz);
    for(int c = 0; c < chans; c++)
    {
        for(int i = 0; i < sz; ++i)
        {
            float* p = noise.ptr<float>(i) + c;
            for(int j = 0; j < sz; ++j)
            {
                buffer[j] = *p;
                p += chans;
            }
            f.write((const char *) &buffer[0], sizeof(float) * buffer.size());
        }
    }
    f.close();
}

如果你想在(行 = 15,col = 15(访问通道 15,鉴于您不知道编译时的通道数(所以你不能使用 at() (,你可以这样做;

float get(cv::Mat m, int row, int col, int chan)
{
    float* p = m.ptr<float>(row);
    return p[col * m.channels() + chan];    
}
/* ... */
cout << get(noise, 15, 15, 15) << endl;

请注意,使用这样的get()对像素进行顺序访问是不合适的(因为与我在writeNoise()中那样访问像素相比,它会非常慢(