如何使用Contour使用OpenCV为完美的Rectangle构造点

时间:2014-08-27 08:59:14

标签: android opencv

我从findContous()获得积分。如何将它们转换为方形矩形,以便我可以裁剪图像。

ArrayList contours = new ArrayList();
             Mat hierarchy = new Mat();
             Imgproc.findContours(panoChange,contours,hierarchy,Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);

我想消除黑色的顶部和底部条纹,并使得到的图像成为完美的图形

我正在使用Java for OpenCV。任何帮助赞赏。 enter image description here

1 个答案:

答案 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));

这将在两侧裁剪相同的宽度,使其成为正方形。