我试图创建一个点填充白色的面罩。我反而得到点缀的轮廓

这是代码

public Mat getFaceMask(Mat image){

        Mat faceMask =  Mat.zeros(image.size(), image.type());

        List<MatOfPoint> faceConvexHull = new ArrayList<>();
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(197, 154)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(190, 197)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(182, 217)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(170, 234)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(155, 251)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(138, 264)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(121, 268)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(104, 265)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(88, 253)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(73, 238)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(61, 221)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(51, 202)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(46, 181)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(42, 159)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(41, 137)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(49, 116)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(73,  95)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(164,  95)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(190, 115)));
        faceConvexHull.add(new MatOfPoint(new org.opencv.core.Point(197, 133)));

        fillPoly(faceMask, faceConvexHull, new Scalar(255, 255, 255));

        return faceMask;
    }

这就是我想要的效果

这就是我得到的

最佳答案

就像上面的Dan Masek指出的那样,fillPoly的输入是“多边形数组,其中每个多边形都表示为点数组。”

按照建议,我将地标转换为一组点,并将它们全部推入一个MatOfPoint实例

public Mat getFaceMask(Mat image){

    List<Point> faceConvexHull = new ArrayList<>();
    faceConvexHull.add(new Point(197, 154));
    faceConvexHull.add(new Point(190, 197));
    faceConvexHull.add(new Point(182, 217));
    faceConvexHull.add(new Point(170, 234));
    faceConvexHull.add(new Point(155, 251));
    faceConvexHull.add(new Point(138, 264));
    faceConvexHull.add(new Point(121, 268));
    faceConvexHull.add(new Point(104, 265));
    faceConvexHull.add(new Point(88, 253));
    faceConvexHull.add(new Point(73, 238));
    faceConvexHull.add(new Point(61, 221));
    faceConvexHull.add(new Point(51, 202));
    faceConvexHull.add(new Point(46, 181));
    faceConvexHull.add(new Point(42, 159));
    faceConvexHull.add(new Point(41, 137));
    faceConvexHull.add(new Point(49, 116));
    faceConvexHull.add(new Point(73,  95));
    faceConvexHull.add(new Point(164,  95));
    faceConvexHull.add(new Point(190, 115));
    faceConvexHull.add(new Point(197, 133));

    org.opencv.core.Point [] pointArray = new org.opencv.core.Point[faceConvexHull.size()];

    Point pt;
    for(int i = 0; i < faceConvexHull.size(); i++){
        pt = faceConvexHull.get(i);
        pointArray[i] = new org.opencv.core.Point(pt.x, pt.y);
    }



    Mat faceMask =  Mat.zeros(image.size(), CV_8UC3);

    MatOfPoint points = new MatOfPoint(pointArray);

    fillConvexPoly(faceMask, points, new Scalar(255, 255, 255));

    return faceMask;
}

09-10 09:46
查看更多