1

检查代码一千次后,我看不出我做错了什么。该算法非常简单:我有一个 CV_16U 图像,其视差值称为 disp,我正在尝试构建 u 和 v 视差以检测障碍物。

Mat v_disparity, u_disparity;
v_disparity=Mat::zeros(disp.rows,numberOfDisparities*16, CV_16U);
u_disparity=Mat::zeros(numberOfDisparities*16,disp.cols, CV_16U);
for(int i = 0; i < disp.rows; i++)
{
    d = disp.ptr<ushort>(i);    //d[j] is the disparity value
    for (int j = 0; j < disp.cols; ++j)
    {
        v_disparity.at<uchar>(i,(d[j]))++;
        u_disparity.at<uchar>((d[j]),j)++;
    }
}

问题是当我在转换为 8bit Unsigned 后使用 imshow 打印两个差异时。u-disparity 是错误的,因为它具有应有的形状,但它是水平尺寸的一半,即正确的黑色像素。

4

1 回答 1

0

我终于弄明白了。只是我在访问 和 中的像素值时使用了错误的u模板v-disparities。在 v-disparity 中我没有检测到它,因为我认为 disp 中没有具有高视差值的像素。总结一下,以下几行:

    v_disparity.at<uchar>(i,(d[j]))++;
    u_disparity.at<uchar>((d[j]),j)++;

必须替换为:

    v_disparity.at<ushort>(i,(d[j]))++;
    u_disparity.at<ushort>((d[j]),j)++;

因为两个图像都是 CV_16U,并且 uchar 类型是 8 位,而不是 16 位。

于 2015-11-11T19:47:40.990 回答