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

时间:2014-09-08 13:25:00

标签: c++ opencv matrix typedef

我在brunocodutra in his answer的帮助下在opencv,c ++中创建了一个 3D浮动矩阵。我的矩阵 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 found\n");
    }
    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);   
}

有人可以指导我吗?如果它已被问到问题,抱歉。

提前致谢,

1 个答案:

答案 0 :(得分:0)

你的Mat似乎是我认为的具有N个通道的2D Mat。就像典型的图像是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 found\n");

    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();
}

如果你想在(row = 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()中的像素相比,它会非常慢)