2017-08-10 163 views
0

我正在研究一個程序,該程序可以提取拼圖上的貼紙,然後再找到它們的RGB。目前,我正處於想要刪除任何非「方形」的輪廓。我想知道我該如何做到這一點。查找並消除輪廓opencv

我所做的是我加載圖像,灰色它,模糊它,canny邊緣檢測,擴大它找到輪廓,並繪製它們。

有沒有辦法繞着輪廓繪製而不是填充它們?並刪除輪廓不是大致相同的大小或幾乎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

這裏是與輪廓線的圖像得出:

enter image description here

回答

1

要繪製非填充的輪廓使用非負厚度: Imgproc.drawContours(capturedFrame,contour,i,new Scalar(0,0,255),1);例如。

刪除不必要的查找輪廓區域,並在繪圖時跳過太大或太小。

+0

謝謝我現在正在繪製輪廓:)。有沒有辦法讓它更具「靈活性」,比如看它是否具有某種方形的形狀,例如兩側的長度相同,或者輪廓幾乎有90度?我問的原因是因爲圖像並不總是這一個,因爲它是一個被捕捉的框架,立方體可以被捕捉得更近或更遠。 – ProgrammingCuber

+0

如果輪廓區域接近minAreaRect區域,可以發現minAreaRect,這意味着輪廓接近矩形。您可以通過找到minRect邊的比例來控制它是否平方。 –