我从findContous()获得积分。如何将它们转换为方形矩形,以便我可以裁剪图像。
ArrayList contours = new ArrayList();
Mat hierarchy = new Mat();
Imgproc.findContours(panoChange,contours,hierarchy,Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);
我想消除黑色的顶部和底部条纹,并使得到的图像成为完美的图形
我正在使用Java for OpenCV。任何帮助赞赏。
答案 0 :(得分:1)
我想你需要的是boundingRect - 方法。它创建了一个点集的边界矩形。要获得所有轮廓的边界矩形,可以迭代它们。
此示例显示如何裁剪图像以覆盖图像中的所有轮廓。
// 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));
请记住,如果您想忽略最小的计数(噪音等),您只需检查矩形区域是否大于指定的阈值。
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));
这将在两侧裁剪相同的宽度,使其成为正方形。