【发布时间】:2013-06-26 06:21:21
【问题描述】:
我有一个cv::Mat,它具有以下大小480 x 640 x 32。
您能告诉我如何访问此结构中的数据吗?假设我想从位置[2, 2, 2] 访问元素。我该怎么做?
编辑 1:
我曾尝试使用此template<typename T> const T& Mat::at(int i, int j, int k) const,但收到以下运行时错误:
编辑 2:
这是我使用代码的方式:
cv::Mat f(382,510,32);
f=Utils::toMat(features);
cout<<f.at<double>(1,1,1);
toMat 的详细信息如下。
cv::Mat Utils::toMat( mxArray* p_)
{
mwSize ndims_= mxGetNumberOfDimensions(p_);
const mwSize* dims=mxGetDimensions(p_);
std::vector<int> d(dims, dims+ndims_);
int ndims = (d.size()>2) ? d.size()-1 : d.size();
int nchannels = (d.size()>2) ? *(d.end()-1) : 1;
int depth=CV_64F;
std::swap(d[0], d[1]);
cv::Mat mat(ndims, &d[0], CV_MAKETYPE(depth, nchannels));
// Copy each channel.
std::vector<cv::Mat> channels(nchannels);
std::vector<mwSize> si(d.size(), 0); // subscript index
int type = CV_MAKETYPE(depth, 1); // Source type
for (int i = 0; i<nchannels; ++i)
{
si[d.size()-1] = i;
void *pd = reinterpret_cast<void*>(
reinterpret_cast<size_t>(mxGetData(p_))+
mxGetElementSize(p_)*mxCalcSingleSubscript(p_, si.size(), &si[0]));
cv::Mat m(ndims, &d[0], type, pd);
// Read from mxArray through m
m.convertTo(channels[i], CV_MAKETYPE(depth, 1));
}
cv::merge(channels, mat);
return mat;
}
【问题讨论】:
-
你为什么在其中定义/创建你的 Mat?您必须调用
at函数的方式很大程度上取决于此。另外,发布您调用at函数的代码 -
cv::Mat f(382,510,32); f=Utils::toMat(特征); cout(1,1,1);基本上,toMat,将一个 mxArray 转换为一个 cv::mat 结构
-
你能告诉更多关于这个
Utils::toMat的信息吗?如果能贴出代码就更好了。问题 100% 出在那儿。 -
我已经在问题正文中添加了代码
-
Hmmmmm 首先,你弄错了 cv::Mat docs.opencv.org/modules/core/doc/basic_structures.html#mat-mat 的构造函数:值 32 被用作类型!