2017-08-10 9 views
0

私はパズルのステッカーを抽出し、後でそれらのRGBを見つけるプログラムに取り組んでいます。現在、私は「正方形」でない輪郭を削除したいと考えています。私はこれをどうやってできるのだろうと思っていた。輪郭を見つけて削除するopencv

私は画像を読み込み、グレーにして、ぼかして、鈍いエッジ検出を行い、輪郭を見つけて伸ばします。

輪郭を塗りつぶす代わりに描く方法はありますか?おおよそ同じサイズではない輪郭や、ほぼ90度の角度を持つ輪郭を削除しますか?ここで

public static void main(String[] args) { 


     System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 

     Mat capturedFrame = Imgcodecs.imread("first.png"); 

     //Gray 
     Mat gray = new Mat(); 
     Imgproc.cvtColor(capturedFrame, gray, Imgproc.COLOR_BGR2GRAY); 

     //Blur 
     Mat blur = new Mat(); 
     Imgproc.blur(gray, blur, new Size(3,3)); 
     //Canny image 
     Mat canny = new Mat(); 
     Imgproc.Canny(blur, canny, 20, 40, 3, true); 


     Imgcodecs.imwrite("test.png", canny); 

     //System.exit(0); 
     Mat kernel = Imgproc.getStructuringElement(1, new Size(3,3)); 
     Mat dilated = new Mat(); 
     Imgproc.dilate(canny,dilated, kernel); 


     List<MatOfPoint> contours = new ArrayList<>(); 
     //find contours 
     Imgproc.findContours(dilated, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_NONE); 
     //draw contours 

     Imgproc.cvtColor(capturedFrame, capturedFrame, Imgproc.COLOR_BGR2RGB); 
     for(int i = 0; i < contours.size(); i++){ 
      Imgproc.drawContours(capturedFrame, contours, i, new Scalar(0, 0, 255), -1); 
     } 


     Imgcodecs.imwrite("after.png", capturedFrame); 

     Imshow img = new Imshow("firstImg"); 

     img.show(capturedFrame); 

    } 

初期画像です:

enter image description here

答えて

1

を非満たされた輪郭が非負の厚さを使用描くには:ここで

enter image description here

が描かれた輪郭とのイメージがされています。 Imgproc.drawContours(capturedFrame、contours、i、newスカラー(0、0、255)、1);例えば。

不要な輪郭領域を削除し、描画するには大きすぎたり小さすぎたりしないでください。

+0

私は今、輪郭を描いています:)。辺の長さが同じか、輪郭がほぼ90度のように、正方形のようなものがあるかどうかを調べるような、より柔軟な方法がありますか?私が尋ねる理由は、キャプチャされたフレームであるためにイメージが常にこのイメージにならないからです。 – ProgrammingCuber

+0

あなたの等高線エリアがminAreaRectエリアの近くにある場合は、minAreaRectを見つけることができます。これはあなたの輪郭が長方形に近いことを意味します。 minRectの面の比率を見つけることで、正方形かどうかを制御できます。 –

関連する問題