c++ - 将 16 位深度的 CvMat* 转换为 8 位深度

标签 c++ opencv input kinect depth

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

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

但现在我需要处理这张图片,以便执行 cvThreshdold 并找到轮廓。这两个函数需要一个 8 位深度图像作为输入。如何将 CvMat* depthMetersMat 转换为 8 位深度 CvMat*?

最佳答案

@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 后添加到每个值。查看docs了解更多信息。

关于c++ - 将 16 位深度的 CvMat* 转换为 8 位深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6909464/

相关文章:

c++ - 无法解析的外部符号在非常简单的应用程序中失败

c++ - LIBTIFF 无法使用 C++ 项目

c++ - 运动结构 (openCV) : ‘reconstruct’ was not declared in this scope

c++ - 无法使 Flandmarks 工作,C++,错误 LNK2019,未解析的外部符号

opencv - 删除原始缓冲区时,opencv cvarrtoMat segfault

javascript - 清除表单提交上的输入字段

c++ - 在 VS 15.7.5 中将 opencv 3.4.1 悬停在 Mat 上仍然卡住

opencv - 在 Android 中使用 OpenCV 查找图像匹配

python - Python 3 中的输入变量

powershell - 读取 PowerShell 中的各个按键