首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内存Mat表示中的Opencv

内存Mat表示中的Opencv
EN

Stack Overflow用户
提问于 2016-05-05 01:24:29
回答 4查看 9.8K关注 0票数 11

我知道,在内存中,opencv将Mat对象表示为一个大数组。因此,如果我有维度200x200的3通道垫,那么在内存中,它将把这个垫子存储在一个大小为3x200x200的数组中。或者更普遍地说,内存中的任何Mat都将存储为channels*rows*cols。我们可以得到这样的数组

代码语言:javascript
运行
复制
double *array = (double)mat.data;

假设矩阵是二重型的

现在我的问题是如何索引这个数组--例如,如果我想访问通道ch上的元素,那么下面是有效的索引

代码语言:javascript
运行
复制
array[ch*rows*cols + c * rows + r]

代码语言:javascript
运行
复制
array[ch*rows*cols + r * cols + c]

问候阿赫桑

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-05 01:46:14

正如您在文档上报告的数据布局中所看到的,您可以访问以下值:

代码语言:javascript
运行
复制
for(int r=0; r<rows; ++r){
    for(int c=0; c<cols; ++c){
        for(int ch=0; ch<nchannels; ++ch){
            double val = array[(nchannels*mat.step*r) + (nchannels*c) + ch];
        }
    }
}
票数 9
EN

Stack Overflow用户

发布于 2016-05-05 06:20:26

您可以在数组中获得如下值:

代码语言:javascript
运行
复制
double val = array+ (r*mat.step)+c*mat.channels()+ch;
票数 1
EN

Stack Overflow用户

发布于 2018-09-11 08:17:09

我发现其他答案有点让人困惑:mat.step是以字节为单位的行的大小,而不是(double)元素中的行大小,而且它已经考虑到了通道的数量。要访问val,您应该使用:

代码语言:javascript
运行
复制
double* array = (double*) mat.data; // was (double) mat.data in the question
double value = array[ ((mat.step)/mat.elemSize1())*c+mat.channels()*r+ch]; // (mat.step)/mat.elemSize1() is the actual row length in (double) elements

您可以验证此方法和其他方法,将它们与.at<>操作符进行比较,如下所示:

代码语言:javascript
运行
复制
#include <iostream>
#include <opencv2/core.hpp>

using namespace cv;
using namespace std;

int main()
{
const int w0=5;
const int h=3;
const int w=4;
double data[w0*h*3];
for (int y=0; y<h; y++)
    for (int x=0; x<w0; x++)
        for (int ch=0; ch<3; ch++)
            data[3*(x+w0*y)+ch]=1000+100*(y)+10*(x)+ch;

Mat m0(h,w0,CV_64FC3, data);
Rect roi(0,0,w,h);
Mat mat=m0(roi);

int c=3, r=2, ch=1;
Vec3d v = mat.at<Vec3d>(r,c);
cout<<"the 3 channels at row="<<r<<", col="<<c<<": "<<v<<endl;
double* array= (double*) mat.data;
double expect = 1000+100*r+10*c+ch;
double value= array[ ((mat.step)/mat.elemSize1())*r+mat.channels()*c+ch];
cout<<"row="<<r<<", col="<<c<<", ch="<<ch<<": expect="<<expect<<", value="<<value<<endl;
return  0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37040787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档