在轮廓周围找到4个角多边形,OpenCV

时间:2016-01-22 17:28:36

标签: java android image opencv image-processing

我正在尝试在白黑图像中找到形状的坐标。我使用findContours方法进行轮廓查找,使用approxPolyDP将它们优化为多边形。输入图像中的形状(见下文)是一个已处理的文本,我需要为每个字段找到一个4角多边形,这将使用较少的外部空间来适应这个形状。 ApproxPolyDP函数很少给我4个角(尽管参数变化),我需要使用它来对原始图像应用透视变换并跳过纠偏算法并裁剪出文本。如何为每个字段找到最合适的4个角多边形(不是矩形)?我找不到任何关于如何做到这一点的正确教程,这真的很难吗?下面我在java中呈现我当前的代码;期望的结果;输入;电流输出。 注意:如果你能给我一个不涉及HoughLines的方法,我会非常感激,这种方法很慢(对于手机而言,这就是我问这个问题的原因),但如果这是你知道获得我需要的结果的唯一可能性,请发布它,我们将不胜感激。

查找当前形状的代码:

Mat mask = new Mat(src.size(), CvType.CV_8UC3, new Scalar(0,0,0));
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(src, contours, new Mat(), Imgproc.RETR_CCOMP, Imgproc.CHAIN_APPROX_SIMPLE);

for (int i = 0 ; i < contours.size() ; i++)
{
    int contourSize = (int)contours.get(i).total();

    MatOfPoint2f curContour2f = new MatOfPoint2f(contours.get(i).toArray());
    Imgproc.approxPolyDP(curContour2f, curContour2f, 0.04 * Imgproc.arcLength(curContour2f, true), true);
    contours.set(i, new MatOfPoint(curContour2f.toArray()));

    Imgproc.drawContours(mask, contours, i, new Scalar(0, 255, 0), 3);
}

平均输入:

enter image description here

期望的结果(它不是一个矩形,角不一定是90度,但这里必须是4个):

enter image description here

平均电流输出:

enter image description here

其他输出示例:此处的输入图片更详细(有一些间隙),因此输出会更糟糕,具体取决于我想要的是什么。其他多边形中的多边形不是问题,但整个区块的主要形状有很多角落:

enter image description here

提前谢谢。

0 个答案:

没有答案