[英]How to access data from cv::Mat
我有一個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;
}
> cv::Mat f(382,510,32);
首先,您弄錯了cv::Mat
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-mat的構造函數:您的值32被用作類型,導致一些未定義行為。
你必須用這個
Mat::Mat(int ndims, const int* sizes, int type)
const int[] mySizes = {382,510,32}; //I hope I have written this correctly...
cv::Mat f(3,mySizes,CV_64F). // You find CV_64 in the same documentation page.
然后,您的Utils::toMat
函數看起來調試起來真的很復雜...我建議您閱讀一些有關文檔的信息,並可能使用at
方法重新實現矩陣的初始化(填充):
f.at<double>(x,y,z) = ...
您可以使用.at<element_type>(i,j,k);
參考 :
template<typename T> const T& Mat::at(int i, int j, int k) const
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.