【问题标题】:StereoBM doesn't give proper outputStereoBM 没有提供正确的输出
【发布时间】:2018-02-27 09:08:13
【问题描述】:

我看过很多关于这个问题的帖子,但这个不同。我的代码适用于一对图像,但不适用于另一对图像。

稍后,我想将来自两个摄像头的视频输入转换为立体声输出。我已经尝试过了,但这也与下面显示的图像(第二对图像)有相同的问题。

下图给出了预期的输出

以下图片输出不正确

如何更正我的代码以使其适用于所有图像?

这是我的代码

public static void main(String[] args)
{
    Mat left = Imgcodecs.imread("path", Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
    Mat right = Imgcodecs.imread("path", Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);

    Core.normalize(left, left, 0, 255, NORM_MINMAX, CvType.CV_8U);
    Core.normalize(right, right, 0, 255, NORM_MINMAX, CvType.CV_8U);

    StereoBM bm = StereoBM.create(16, 15);

    Mat disparity = new Mat();
    bm.compute(left, right, disparity);
    ImageProcessor.showResult(disparity);
    mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}

public static void showResult(Mat img)
{
    Imgproc.resize(img, img, new Size(640, 480));
    MatOfByte matOfByte = new MatOfByte();
    Imgcodecs.imencode(".jpg", img, matOfByte);
    byte[] byteArray = matOfByte.toArray();
    BufferedImage buffImage = null;
    try
    {
        InputStream in = new ByteArrayInputStream(byteArray);
        buffImage = ImageIO.read(in);
        JFrame frame = new JFrame();
        frame.getContentPane().add(new JLabel(new ImageIcon(buffImage)));
        frame.pack();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
    } catch (IOException e)
    {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 为了清楚起见,请说明您的代码是“工作”和“不工作”的意思。另请说明一个问题。
  • @jwils “工作”表示“预期输出”。 “不工作”意味着“不正确的输出”

标签: java opencv


【解决方案1】:

在标准化后以灰度查看两张图像 - 就像您的算法看到的那样。至少,我会从那开始。

它采用灰色图像并检测边框。由于所有内容都已标准化,因此可能比来自真实对象的边界更容易看到来自背景的边界。

要解决这个问题,您可以使用不同的算法,例如 background subtraction。希望有帮助。

【讨论】:

  • 但我想找到深度。另外,示例代码会很好。
  • 您的算法通过边界检测对象。这意味着颜色变化。然后比较两张图片,每个物体的重定位决定距离。问题在于第一步。边界是通过颜色变化来检测的,或者更好地说是亮度变化。因此,如果两个物体呈灰色,则很难确定它们是两个物体还是单个物体。在您的示例中,整朵花被视为背景。所以接下来的步骤是没有用的。在提供的链接下有示例。在 C++ 中,但所有名称都相同。
  • 背景减除后的深度应该怎么做?此外,在我的情况下,背景减法不起作用,因为可能是没有前景对象的场景,例如:道路图像
  • this site 中,他们使用相同的图像来创建适当的立体声输出。
  • 当然 - jayrambhia.com/blog/disparity-mpas - 包含相同的图像 + 说明 + 源代码。甚至更多——不仅是 C++,还有 Python。
【解决方案2】:

StereoBM 计算两个图像之间的相关性。在第二对中,您可以在墙上看到图案 - 这可能会导致问题(与另一个图案元素更好地相关)。如您所见,您的植物保持黑色(最远的元素,对应点之间的距离最短)。 在数字图像相关中,图像中强度的随机分布越多,结果越好。为了增加强度分布的随机性,对物体添加特殊的随机模式进行了很多研究。

https://orbi.ulg.ac.be/bitstream/2268/15779/2/Quality%20assessment%20of%20speckle%20patterns%20for%20digital%20image%20correlation%20(2006)%20(OCR).pdf

您可以通过添加最大距离约束或使用一些基于距离的函数修改图像来解决该问题。作为该函数的原点,您可以使用点,它有两个彼此最接近的相关点。然后你可以执行第二次迭代。

【讨论】:

  • 但这也是从两个摄像机的视频输入创建的立体声输出中。没有这样的模式会影响相关性。例如,男人站在房间里。
  • 你能在你的算法中添加每一步的结果图像吗?规范化可能是这里的一个问题。
  • “每一步的结果图像”是什么意思?你的意思是标准化之后?
猜你喜欢
  • 2021-04-28
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2013-01-04
  • 2023-03-06
  • 2021-06-15
相关资源
最近更新 更多