3

cv::Matのサイズの があり480 x 640 x 32ます。

この構造内のデータにアクセスする方法を教えてください。position から要素にアクセスしたいとしましょう[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;
}
4

2 に答える 2

5
> 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) = ...
于 2013-06-25T22:15:13.100 に答える
0

使用できます.at<element_type>(i,j,k);

参照して:

template<typename T> const T& Mat::at(int i, int j, int k) const
于 2013-06-25T18:54:58.650 に答える