0

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

  1. 在灰度图像上应用高斯模糊
  2. 使用 Canny 检测边缘,使用 Otsu 阈值
  3. 带矩形的 MorphEx
  4. 查找轮廓

这会产生不错的结果,但在某些情况下,轮廓并不完美。在以下图像中可以看到原始图像检测到的轮廓

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

我被困住了。关于如何细化轮廓的任何提示?

这是供参考的代码(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);
4

0 回答 0