У меня есть cv::Mat
, который имеет следующий размер 480 x 640 x 32
.Как получить доступ к данным из cv :: Mat
Не могли бы вы показать мне, как я могу получить доступ к данным в этой структуре? Предположим, что я хочу получить доступ к элементу с позиции [2, 2, 2]
. Как я могу это сделать?
EDIT 1:
Я попытался с помощью этого template<typename T> const T& Mat::at(int i, int j, int k) const
, но я получаю следующее сообщение об ошибке во время выполнения:
EDIT 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;
}
В чем вы определили/создали свой Мат? От этого зависит то, как вы должны называть функцию 'at'. Кроме того, разместите код, в котором вы вызываете функцию 'at' – Antonio
cv :: Mat f (382,510,32); f = Utils :: toMat (функции); cout < (1,1,1); В основном, toMat, преобразовать mxArray в структуру cv :: mat –
Simon
Можете ли вы рассказать об этом 'Utils :: toMat'? Если вы можете опубликовать код, это еще лучше. Проблема там на 100%. – Antonio