OpenCV船体坐标

uqdfh47h  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(109)

我想找到船体,以便在纸上均匀手绘三角形的边缘。使用图像处理进行平滑是不够的,因为我也需要检测这个三角形,如果使用approxPolyDP函数,手绘三角形往往有三个以上的点。三角形的船体由approxPolyDP函数正确识别。
问题是,我在图像中也有其他形状,在这些形状上创建了一个船体。
Before convex hull is used: Notice the contour labelled 3
After convex hull is used: the end points have been joined and the contour labelled 3 forms a triangle
现在我想以某种方式排除轮廓3被检测为三角形。要做到这一点,我的策略是从名为hullMop的ArrayList中完全删除这个轮廓。这是因为我的三角形检测函数使用hullMop的轮廓,所以它甚至不会检查标记为3的轮廓。
extcontour是使用船体之前的轮廓。此函数检查hullMop中的点是否位于extcontouts内。如果不是,那么必须从hullMop中删除,因为它们是由于凸包而生成的额外点集,或者换句话说,第二个图像中的红线。
在这一点上,我觉得我的概念有一个漏洞。openCV文档指出,凸船体返回原始数组的点的子集,换句话说,extcontouts的点的子集。
我的问题是,我如何得到由convexHull函数创建的红线的点。我不想使用findContours,因为我觉得有更好的方法。

private void RemoveFalseHullTriangles(ArrayList<MatOfPoint> extcontours, ArrayList<MatOfPoint> hullMop, int width, int height) {
    //if every single point of hullmop doesnt touch or isn't inside extcontours, then that point must be the red line
    MatOfPoint2f Contours2f = new MatOfPoint2f();
    double [] newA = new double[2];
    int hullCounter = 0;
    A: for(int i =0;i<extcontours.size();i++) {
        MatOfPoint ExtCnt = extcontours.get(i);
        MatOfPoint HullCnt = hullMop.get(hullCounter);
        ExtCnt.convertTo(Contours2f, CvType.CV_32F);
        B: for (int j = 0; j < HullCnt.rows(); j++) {
            double[] pt = new double[2];
            pt[0] = HullCnt.get(j,0)[0];
            pt[1] = HullCnt.get(j,0)[1];

            if (Math.abs(Imgproc.pointPolygonTest(Contours2f, new Point(pt), true)) > 40) {
                    //Remove index from HullMop
                hullMop.remove(hullCounter);
                hullCounter--;
                break B;
            }

        }
        hullCounter++;
    }
}

因为hullMop仅具有extcontours的点的子集,所以在使用凸包之后,i可能永远不知道标记为3的轮廓的红线的点。除了使用findContours之外,是否有任何方法可以获得由船体生成的红线的坐标?

lfapxunr

lfapxunr1#

正如Alexandar Reynolds所提到的,问题实际上是首先检测开放轮廓并在找到船体之前排除这些轮廓。这里解释了查找开放轮廓的方法:Recognize open and closed shapes opencv
基本上,如果一个外部轮廓在层次结构中没有子轮廓,那么它是一个开放轮廓,必须在找到船体之前排除(对于我的例子)。

相关问题