我想你需要的是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));
這將裁剪雙方相同的寬度,使之方。
你能展示一個樣本圖片嗎?你將不得不決定輪廓是否實際上是矩形的,還是隻想爲任意物體找到邊界框?如果你想找到一個邊界框,試試'boundingRect'函數:http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html – Micka 2014-08-27 09:14:24
我更新了這個問題。感謝您的回覆 – Abid 2014-08-27 09:43:01