我在迭代OpenCV Mat
的坐标时遇到了问题:
cv::Mat picture = cv::Mat(depth.rows, depth.cols, CV_32F);
for (int y = 0; y < depth.rows; ++y)
{
for (int x = 0; x < depth.cols; ++x)
{
float depthValue = (float) depth.at<float>(y,x);
picture.at<float>(y, x) = depthValue;
}
}
cv::namedWindow("picture", cv::WINDOW_AUTOSIZE);
cv::imshow("picture", picture);
cv::waitKey(0);
结果图片:
之前(深度)
之后(图片)
看起来很像 1.缩放和 2.停在宽度的三分之一处。有什么想法吗?
答案 0 :(得分:4)
您的深度图片看起来有3个频道。
BW图像(B=G=R)
的所有通道值都相同,因此您有BGRBGRBGR
而不是GrayGrayGray
,并且您尝试访问它,因为它是1通道,这就是图像的原因水平拉伸3次。
在运行循环之前尝试cv::cvtColor(depth,depth,COLOR_BGR2GRAY)
。
答案 1 :(得分:0)
您的迭代代码是正确的。
相反,cv::Mat depth
类型假设是错误的。
如建议的那样,根据失真情况可能是CV_U8C3
。
要获取此类CV_8UC3
矩阵的像素值,可以使用:
cv::Vec3i depthValue = depth.at<cv::Vec3i>(y,x);
然后使用此标量执行任何您想要的操作。
例如,如果您的depth
类型为CV_8UC3
,并且距离编码在前两个字节中(MSB在前),则可以使用以下方式获取距离:
float distance = depthValue[0] * 255 + depthValue[1];