11

我正在使用 Kinect 和 OpenCV。我已经在这个论坛中搜索过,但我没有发现任何类似我的问题。我保留来自 Kinect(16 位)的原始深度数据,将其存储在 CvMat* 中,然后将其传递给 cvGetImage 以从中创建 IplImage*:

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

但现在我需要处理这个图像才能进行 cvThreshdold 并找到轮廓。这两个函数需要输入 8 位深度图像。如何将 CvMat* depthMetersMat 转换为 8 位深度 CvMat* ?

4

2 回答 2

21

@SSteve 给出的答案几乎对我有用,但调用convertTo似乎只是切断了高位字节,而不是实际将值缩放到 8 位范围。由于@Sirnino 没有指定需要哪种行为,我想我会发布将执行(线性)缩放的代码,以防其他人想要这样做。

SSteve 的原始代码:

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

要缩放值,您只需将缩放因子(1/256 或 0.00390625,用于 16 位到 8 位缩放)作为第三个参数 (alpha) 添加到调用convertTo

m2.convertTo(m2, CV_8U, 0.00390625);

您还可以添加第四个参数 (delta),该参数将在乘以 alpha 后添加到每个值。有关更多信息,请参阅文档

于 2012-05-02T19:57:14.553 回答
2

这应该有效:

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

但是根据 OpenCV 文档,CvMat 已经过时了。您应该改用 Mat。

于 2011-08-02T16:07:12.077 回答