2014-08-27 63 views
-1

我有來自findContous()的點。我如何將它們轉換爲方形矩形,以便裁剪圖像。我如何使用輪廓構建使用OpenCV的完美矩形的點

ArrayList contours = new ArrayList();
墊層次結構=新的墊子();
Imgproc.findContours(panoChange,contour,hierarchy,Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);

我想要消除的黑色頂部和底部的酒吧,使生成的圖像完美sqaure

我使用Java進行的OpenCV。任何幫助讚賞。 enter image description here

+1

你能展示一個樣本圖片嗎?你將不得不決定輪廓是否實際上是矩形的,還是隻想爲任意物體找到邊界框?如果你想找到一個邊界框,試試'boundingRect'函數:http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html – Micka 2014-08-27 09:14:24

+0

我更新了這個問題。感謝您的回覆 – Abid 2014-08-27 09:43:01

回答

1

我想你需要的是boundingRect -method。它創建一個點集的邊界矩形。爲了得到所有輪廓的邊界矩陣,可以遍歷它們。

此示例顯示如何裁剪圖像以覆蓋圖像中的所有輪廓。

 // original mat 
     Mat mat = .... 

     int top = mat.height(); 
     int left = mat.width(); 
     int right = 0; 
     int bottom = 0; 
     List<MatOfPoint> contours = new ArrayList<MatOfPoint>();  
     Imgproc.findContours(copy, contours, new Mat(), Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE); 
     for(int i=0; i< contours.size();i++){ 
      if(Imgproc.contourArea(contours.get(i)) < mat.getHeight()*mat.getWidth()){ 
       Rect rect = Imgproc.boundingRect(contours.get(i)); 
       if(rect.x < left){ 
        left = rect.x; 
       } 
       if(rect.x+rect.width > right){ 
        right = rect.x+rect.width; 
       } 
       if(rect.y < top){ 
        top = rect.y; 
       } 
       if(rect.y+rect.height > bottom){ 
        bottom = rect.y+rect.height; 
       } 
      } 
     } 
     // crop image to the bounding rectangle covering all contours 
     Point topLeft = new Point(left, top); 
     Point bottomRight = new Point(right, bottom); 
     Mat cropped = new Mat(mat, new Rect(topLeft, bottomRight)); 

記住,如果你想忽略最小countours(噪聲等),你可以檢查是否矩形面積小於規定的閾值。

if(Imgproc.contourArea(contours.get(i)) < threshold)) 

編輯:答案可能不是問題的編輯後,有關的,因爲它導致了兩個不同的問題。爲了去除上下黑邊,同時還使輸出圖像的正方形,這樣的事情可以做:

int upperBarHeight = ... 
int lowerBarHeight = ... 
int diff = (mat.getWidth() - mat.getHeight())/2; 
Point topLeft = new Point(left+diff, top+upperBarHeight); 
Point bottomRight = new Point(right-diff, bottom-lowerBarHeight); 
Mat cropped = new Mat(mat, new Rect(topLeft, bottomRight)); 

這將裁剪雙方相同的寬度,使之方。

+0

感謝您的回覆。我已經上傳了圖片。我想刪除所有的頂部和底部的黑色條和輸出圖像應該是一個完美的方形 – Abid 2014-08-27 09:46:04

+0

@Abid:哦,我看你現在編輯你的帖子,突然間這個問題有點不同。如果你想用輪廓來裁剪圖像,那麼你應該在我的答案中使用該方法。如果你只是想裁剪圖像,只需使用:Mat croppedImage = new Mat(originalImage,squareRect); – 2014-08-27 09:50:51

+0

非常感謝。這改善了形象,但仍然是形象不是一個完美的廣場。我需要使輸出圖像成爲一個方形 – Abid 2014-08-27 10:07:21