2011-08-02 2 views
8

저는 Kinect 및 OpenCV와 함께 작업하고 있습니다. 이미이 포럼에서 검색했지만 내 문제와 같은 것을 찾지 못했습니다. 내가 키 넥트 (16 비트)에서 원시 깊이 데이터를 유지, 나는 *는 CvMat에 저장 한 후 나는 cvGetImage로 전달 그것에서 IplImage *를 만들 :16 비트 심도 CvMat *를 8 비트 깊이로 변환

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
[...] 
cvGetImage(depthMetersMat,temp); 

을하지만 지금은 일할 필요 이 이미지에서 cvThreshdold를 수행하고 등고선을 찾으십시오. 이 두 함수는 8 비트 깊이 영상을 입력으로 필요로합니다. CvMat * depthMetersMat를 8 비트 심도의 CvMat *로 변환하려면 어떻게해야합니까?

답변

2

이 작동합니다 :

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
cv::Mat m2(depthMetersMat, true); 
m2.convertTo(m2, CV_8U); 

그러나 according to the OpenCV docs, CvMat가되지 않습니다. 대신 매트를 사용해야합니다.

19

@SSteve가 주었던 대답은 거의 나를 대신했지만, convertTo에 대한 호출은 값을 실제로 8 비트 범위로 스케일링하는 대신 상위 바이트를 잘라 버린 것처럼 보였습니다. @Sirnino는 어떤 동작이 필요한지에 대해 지정하지 않았기 때문에, 다른 사람들이 그것을 원한다면 (선형) 크기 조정을 수행 할 코드를 게시 할 것이라고 생각했습니다.

SSteve의 원본 코드 :

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
cv::Mat m2(depthMetersMat, true); 
m2.convertTo(m2, CV_8U); 

방금 ​​(8 비트 확장에 16 비트에 대한 1/256, 또는 0.00390625) 규모 계수를 추가해야 값을 확장 할 수있는 등 convertTo

m2.convertTo(m2, CV_8U, 0.00390625); 

호출에 세번째 파라미터 (알파)는 또한 알파가 곱 후의 각 값에 추가 될 네 번째 매개 변수 (델타)를 추가 할 수있다. 자세한 내용은 docs을 참조하십시오.

+2

"크기 조정"의 의미는 무엇입니까? – Maystro

+2

@Maystro에서 부호없는 16 비트 숫자는 0에서 65,535 사이의 값을 가질 수 있지만, 0에서 255까지의 값만 가질 수있는 8 비트 숫자에 맞게 값이 필요합니다. 이는 각 값에 상수 (이 경우 0.00390625)를 곱하는 것을 의미합니다. 0에서 255까지의 값을 갖는 원래의 행렬의 숫자는 새로운 값 0을 얻습니다. 256에서 511은 1이되고, 512에서 767은 2가됩니다. – Gillfish

+1

따라서 m22.convertTo (m2/256, CV_8U)와 같습니다. 권리? 또 다른 질문은, 만약 우리가 scale factor 매개 변수를 전달하지 않았다면? 어떻게 계산 될까요? – Maystro