2013-04-19 2 views
3

제가CV_32FC3 CvMat의 요소 검색?

cvCreateMat(1,1,CV_32FC3); 

이 구조까지 I 그것을 이해 (세 값을 후속 OpenCV의 함수 호출에 의해 가득 채운다를 호출하여 CvMat 구조를 생성하고있어,이 추가로는 1x1 배열 3의 깊이).

그래서 어떻게이 세 가지 값에 액세스 할 수 있습니까?

CV_MAT_ELEM(myMat,float,0,0) 

에 대한 정상적인 호출은 배열 차원 인덱스 만 예상하고 깊이는 예상하지 않으므로 작업을 수행하지 않습니다. 그렇다면이 값들을 어떻게 얻을 수 있습니까?

감사합니다.

답변

2

일반적인 방법 : 매트

이고
type value=myMat.at<cv::VecNT>(j,i)[channel] 

귀하의 경우 :

Mat mymat(1,1,CV_32FC3,cvScalar(0.1,0.2,0.3)); 
float val=mymat.at<Vec3f>(0,0)[0]; 

모든 유형은 cv :: VecNT 클래스를 사용하여 정의되며 여기서 T는 유형이고 N은 벡터 요소의 수입니다.

2

CV_32FC3은 32 비트 플로트의 3 채널 매트릭스입니다. 3 개의 부동 요소를 사용하고 CV_MAT_ELEM을 사용하여 struct 요소를 선언하면 각 채널에 액세스 할 수 있습니다. 예를 들어

typedef struct element { 
     float cn1; 
     float cn2; 
     float cn3; 
} myElement; 

myElement data[N] = ...; 
CvMat mat = cvMat(1, 1, CV_32FC2, data); 

float channel1 = CV_MAT_ELEM(mat, float, 0, 0).cn1; 
float channel2 = CV_MAT_ELEM(mat, float, 0, 0).cn2; 
float channel3 = CV_MAT_ELEM(mat, float, 0, 0).cn3; 

편집 :

각 채널에 액세스 할 수있는 또 다른 방법은 하부 ptr 구조를 사용하는 것이다 : 이력서 액세스 할

mat.ptr<float>(x, y) [channel]; 
+0

정상적으로 문제가 해결되지는 않습니다. 여기서 필자가 데이터 [N]을 채우는 부분이 누락되었습니다. 이는 내가 호출하는 OpenCV 함수에 의해 수행됩니다. 그래서 myMat이 CV_32FC3으로 생성되면 OpenCV가 데이터를 채운 다음이 데이터에 액세스하려고합니다. 채널에 액세스하기 위해 myMap에 구조체를 할당하는 위치/방법을 알지 못한다는 의미입니다. – Elmi

+0

@Elmi : 내 편집 된 게시물보기. 'ptr' 멤버도 사용할 수 있습니다. –