2017-09-18 3 views
8

私はこの問題に関して多くの記事を見てきましたが、これは異なっています。私のコードはイメージの1つのペアで動作していますが、イメージの別のペアでは動作しません。StereoBMが適切な出力を出さない

後で、2台のカメラからのビデオ入力をステレオ出力に変換したいと考えています。私はそれを試みたが、それはまた、以下に示す画像(第2の画像のペア)と同じ問題を有する。

下の画像

は出力

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 "working"は "期待される出力"を意味します。 「働かない」とは「間違った出力」を意味する –

答えて

0

見て、私のコードです - あなたのアルゴリズムはそれを見ていると同じように。少なくとも、私はそれから始めるだろう。

灰色の画像を取り、枠線を検出します。すべてが正規化されているので、おそらく背景からの境界線が実際のオブジェクトの境界線よりもよく見えます。

background subtractionのような別のアルゴリズムを使用することができます。希望が役立ちます。

+0

しかし、私は深みを見つけたい。また、サンプルコードは素晴らしいでしょう。 –

+0

あなたのアルゴリズムは、オブジェクトを境界線で検出します。それは色の変化を意味します。次に、2つの画像が比較され、各オブジェクトの再配置によって距離が決定されます。問題は最初のステップです。ボーダーは色の変化、または輝度の変化によって検出されます。したがって、2つのオブジェクトが灰色を帯びている場合、それらが2つのオブジェクトであるか単独であるかを判断することは困難です。あなたの例では、全体の花は背景として扱われます。だから次のステップは役に立たない。提供されたリンクの下にサンプルがあります。 C++では、すべての名前は同じです。 –

+0

バックグラウンドを引いた後に深さを見つけるにはどうすればよいですか?また、バックグラウンドの減算は、前景オブジェクトが存在しないシナリオである可能性があるため、私の場合は機能しません。例:道路の画像 –

0

ステレオBMは、2つの画像間の相関を計算します。 2番目のペアでは、壁にパターンが表示されます。これは問題を引き起こす可能性があります(別のパターン要素との相関が良い)。あなたが見ることができるように、あなたの植物は黒色(最も遠い要素、対応する点の間の最小距離)のままです。 デジタル画像相関では、画像内の強度の分布がよりランダムになるほど良い結果が得られます。強度分布のランダム性を高めるために、オブジェクトに追加される特殊なランダムパターンについて多くの研究が行われています。

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

あなたは、最大距離の制約を追加することによって、その問題を修正したり、いくつかの距離ベースの機能であなたのイメージを変更することができます。その関数の起点として、互いに最も近い2つの相関点を持つ点を使用することができます。その後、2回目の反復を実行できます。

+0

しかし、これは2台のカメラからのビデオ入力から作成されたステレオ出力にもありました。相関に影響を及ぼすパターンはありません。たとえば、男性は部屋に立っている。 –

+0

アルゴリズムのすべてのステップの結果画像を追加できますか?ここでは正規化が問題になる可能性があります。 –

+0

「すべてのステップの結果イメージ」という意味で?正規化したら意味はありますか? –

関連する問題