0

作为一名 Matlab/Python 人员和 C++ 新手,我非常沮丧地转向使用 C++ 中的 OpenCV 进行图像处理。我正在使用 Kinect v2,所以我在网上只找到了一个我正在修改的 Windows 示例。

此示例将深度图作为 cv::Mat 提供,并且我已经计算了从 kinect v2 获取的深度图像上的表面法线。此表面法线图像包含每行、col 元素的 i、j、k 向量分量(3 个通道),我试图将此表面法线图像(3-D 浮点矩阵)可视化为 RGB 图像。这在 matlab 中很容易做到,因为您只需执行 imshow(normMap) 并显示一个 RGB (ijk) 图像,其颜色指定法线的方向。

我正在尝试在 C++ 中做类似的事情。由于我使用的是 opencv,我决定使用 cv::Mat 来存储每个像素的 ijk 通道,并将正常矩阵(我们称之为 normMat)初始化为 CV_32F 矩阵,如下所示:

int sizes[3] = { height, width, 3 };
cv::Mat normMat(3, sizes, CV_32F, cv::Scalar::all(0));

但是,如果我调试,dims(normMat.rows 和 normMat.cols)显示为-1,所以我不知道我的初始化是坏的还是我错过了什么,或者它是否正常。

我将表面法线分量存储为:

normMat.at<float>(i, j, 0) = fVec3[0];
normMat.at<float>(i, j, 1) = fVec3[1];
normMat.at<float>(i, j, 2) = fVec3[2];

他们似乎得到了正确的存储,因为我已经在调试(使用normMat.at<float>(i,j,k))中验证了这一点。

然后我试图将图像显示为:

normMat.convertTo(normColorMap, CV_8UC3, 255.0 / (4000), 255.0 / 500);
cv::imshow("Normals", normColorMap);

但是第二行抛出了一个异常:

OpenCV Error: Assertion failed (p[-1] 
<= 2) in cv::MatSize::operator.....

我也尝试normMat直接显示抛出相同的异常。这意味着将 3 通道图像显示为 3D 矩阵或将其转换为 2D-3 通道垫显然有问题。我也尝试将 normMat 初始化为

cv::Mat normMat(height, width, CV_32FC3, cv::Scalar::all(0));

但是如果我可以这样说的话,我在将数据添加到“2D 3 通道矩阵”(CV_32FC3)的 3 个通道时遇到问题。

我要做的就是将此 normMat 显示为 RGB 图像。任何输入,建议都受到高度赞赏。谢谢!

4

0 回答 0