2013-06-25 3 views
2

480 x 640 x 32을 따르는 cv::Mat이 있습니다.cv :: Mat에서 데이터에 액세스하는 방법

이 구조 내에서 데이터에 액세스하려면 어떻게해야합니까? 위치 [2, 2, 2]에서 요소에 액세스하려고한다고 가정 해 보겠습니다. 어떻게해야합니까?

편집 1 :이 template<typename T> const T& Mat::at(int i, int j, int k) const를 사용하여 시도했지만 나는 다음과 같은 런타임 오류가 나타납니다

:

enter image description here

편집 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; 
} 
+2

왜 매트를 정의/작성 했습니까? 'at' 함수를 호출하는 방법은 그것으로부터 크게 좌우됩니다. 또한,'at' 함수를 호출하는 코드를 게시하십시오. – Antonio

+0

cv :: Mat f (382,510,32); f = Utils :: toMat (기능); cout < (1,1,1); 기본적으로 toMat는 mxArray를 cv :: mat 구조체로 변환합니다. – Simon

+0

이 'Utils :: toMat'에 대해 더 많이 알 수 있습니까? 코드를 게시 할 수 있다면 더 좋습니다. 문제는 거기에 100 % 위치합니다. – Antonio

답변

4
> cv::Mat f(382,510,32); 

과 함께 시작하려면, 당신은 잘못 cv::Mathttp://docs.opencv.org/modules/core/doc/basic_structures.html#mat-mat의 생성자를 가지고 정의되지 않은 동작.

당신은 그런이

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 기능은 정말 디버깅 복잡 보인다 ... 난 당신이 문서에 대한 좀 더 읽어, 당신이를 다시 구현 가능하게하는 것이 좋습니다 방법을 사용하여 매트릭스의 초기화 (채우기) :

f.at<double>(x,y,z) = ... 
+0

왜이 방법은 일반 이미지에서 작동하지 않습니까? 'cv :: Mat image = imread ("D : \\ img.jpg")'를 사용하여 간단한 이미지를 읽으려고하는데 다음 명령을 사용하여 픽셀 값에 접근하려고합니다 :'cout << image.at (1,1,1) << endl; '왜 충돌이 발생합니까? 질문 본문의 인쇄 화면 오류에 표시된 오류와 동일한 오류를 반환합니다. – Simon

+0

@Simon 대답은 매우 간단합니다 : cv :: Mat :: at()을 사용할 때 읽고있는 cv :: Mat의 네이티브 타입을 정확하게 지정할 수 있어야합니다.8 비트 심도의 컬러 이미지의 경우 jpg 이미지의 크기는 2 차원뿐이므로 image.at (x, y)을 사용해야합니다. 다음은 vec의 설명서입니다. http://docs.opencv.org/modules/core/doc/basic_structures.html#vec "cv :: Mat 내부의 기본 유형 이해"주제에서 재미있는 독서가 가능합니다. http://stackoverflow.com/questions/10167534/how-to-find-out-what-type-of-a-mat-object-is-with-mattype-in-opencv – Antonio

0

당신은 reference.at<element_type>(i,j,k);

을 사용할 수 있습니다 : 선도 형으로 사용하여 값 32 :

template<typename T> const T& Mat::at(int i, int j, int k) const 
관련 문제