2017-09-18 154 views
8

我看过很多关于这个问题的帖子,但这一个是不同的。我的代码适用于一对图像,但不适用于另一对图像。StereoBM没有给出正确的输出

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

的下面图像给出预期输出

enter image description here enter image description here enter image description here

的下面的图像给出不正确的输出

enter image description here enter image description here enter image description here

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

这里是我的代码

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(); 
    } 
} 
+0

要说清楚,请说明您的代码是“正在工作”还是“未正常工作”。还请指出一个问题。 – jwils

+0

@jwils“工作”是指“预期产出”。 “不工作”的意思是“不正确的输出” –

回答

0

看待灰度两个图像,归一化后 - 就像你的算法看到它。至少,我会从此开始。

它需要灰色图像并检测边框。因为所有的都是正常化的,所以从背景中看到的边界可能比从你的真实物体看到的更好。

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

+0

但我想找到深度。此外,示例代码会很好。 –

+0

您的算法通过边界检测对象。这意味着颜色的变化。然后比较两张图片,每个对象的重新定位决定距离。问题在于第一步。边框通过颜色变化来检测,或者更好地说亮度变化。所以如果两个物体是灰色的,那么很难确定它们是两个物体还是单独的单个物体。在你的例子中,整朵花被视为背景。所以接下来的步骤是没用的。在提供的链接下有样本。在C++中,但所有名称都是相同的。 –

+0

我应该怎么做才能找到背景扣除后的深度?此外,背景减法不适用于我的情况,因为可能会出现前景物体不存在的情况。例如:道路的图像 –

0

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

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

您可以通过添加最大距离的限制解决这个问题或修改您的图像与一些基于距离的函数。作为该功能的起源,您可以使用包含两个彼此最接近的相关点的点。然后你可以执行第二次迭代。

+0

但是,这也是从两台摄像机的视频输入创建的立体声输出。没有这样的模式来影响相关性。例如,男人站在一个房间里。 –

+0

你可以在算法中添加每一步的结果图像吗?标准化可能是一个问题。 –

+0

“每一步的结果图像”在这个意义上?你的意思是规范化后? –