我在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);
}
有人可以指导我吗?如果它已被问到问题,抱歉。
提前致谢,
答案 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()
中的像素相比,它会非常慢)