2017-09-18 153 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

「每一步的結果圖像」在這個意義上?你的意思是規範化後? –