OpenCV:细化类似于矩形的轮廓

我正在研究矩形检测软件,它应该检测给定表面上的任何矩形。 在做了一些研究之后,我提出了以下几点:

  • 在灰度图像上应用高斯模糊
  • 用Canny检测边缘,使用Otsu阈值
  • MorphEx与rect
  • Findcontours
  • 这产生了不错的结果,然而在某些情况下轮廓并不完美。 在以下图像中可以看到原始图像,检测到的轮廓。

    我在考虑凸包,但是即使是不是矩形的轮廓也可能被误解为矩形。 也许继续等高线直线并计算交点?

    我被卡住了。 有关如何改善轮廓的任何提示?

    以下是参考代码(Android上的Java):

        detectedEdges = grayImg.clone();
        Size size = new Size(9, 9);
    
        Imgproc.GaussianBlur(grayImg, grayImg, size, 0);
    
        double otsu = Imgproc.threshold(grayImg.clone(),new Mat(),0,255,Imgproc.THRESH_BINARY|Imgproc.THRESH_OTSU);
    
        Imgproc.Canny(grayImg, detectedEdges, otsu/2, otsu);
        Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(4,4));
        Imgproc.morphologyEx(detectedEdges.clone(),detectedEdges,Imgproc.MORPH_CLOSE,kernel);
        contours = new ArrayList<>();
    
        Imgproc.findContours(detectedEdges.clone(),contours,new Mat(),Imgproc.RETR_EXTERNAL,Imgproc.CHAIN_APPROX_SIMPLE);
    
        if (contours.size() == 0) {
            Toast.makeText(getApplicationContext(), "No contours found", Toast.LENGTH_SHORT).show();
            return null;
        }
    
        for(MatOfPoint c : contours){
            MatOfPoint2f contour = new MatOfPoint2f(c.toArray());
    
            double length  = Imgproc.arcLength(contour,true);
            Imgproc.approxPolyDP(contour,contour,0.02*length,true);
            if(contour.total() == 4){
                //found a rect! DO something
            }
        }
    
        Imgproc.drawContours(grayImg,contours,-1,new Scalar(255,225,255), 2);
    
    链接地址: http://www.djcxy.com/p/58731.html

    上一篇: OpenCV: refine contours that are similar to rectangles

    下一篇: How to crop away convexity defects?