通过Mat迭代

时间:2016-10-14 11:31:20

标签: c++ opencv iterator coordinates mat

我在迭代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);

结果图片:

之前(深度)

enter image description here

之后(图片)

enter image description here

看起来很像 1.缩放和 2.停在宽度的三分之一处。有什么想法吗?

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];