Convex Hull on Java Android Opencv 2.3

前端 未结 6 2105
走了就别回头了
走了就别回头了 2020-12-11 06:45

Please help me,

I have a problem for Convex Hull on Android. I use Java and OpenCV 2.3.

Before I made it on Java, I made it on C++ with Vis

6条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-11 07:40

    To add on to what Aurelius said, in your C++ implementation you used a vector of points, therefore the hull matrix contains the actual convex Points:

    "In the first case [integer vector of indices], the hull elements are 0-based indices of the convex hull points in the original array (since the set of convex hull points is a subset of the original point set). In the second case [vector of points], hull elements are the convex hull points themselves." - convexHull

    This is why you were able to call

    drawContours( drawing, hull, i, Scalar(255, 255, 255), CV_FILLED );
    

    In your android version, the hull output is simply an array of indices which correspond to the points in the original contours.get(i) Matrix. Therefore you need to look up the convex points in the original matrix. Here is a very rough idea:

    MatOfInt hull = new MatOfInt();
    MatOfPoint tempContour = contours.get(i);
    Imgproc.convexHull(tempContour, hull, false); // O(N*Log(N))
    //System.out.println("hull size: " + hull.size() + " x" + hull.get(0,0).length);
    //System.out.println("Contour matrix size: " + tempContour.size() + " x" + tempContour.get(0,0).length);
    
    int index = (int) hull.get(((int) hull.size().height)-1, 0)[0];
    Point pt, pt0 = new Point(tempContour.get(index, 0)[0], tempContour.get(index, 0)[1]);
    for(int j = 0; j < hull.size().height -1 ; j++){
        index = (int) hull.get(j, 0)[0];
        pt = new Point(tempContour.get(index, 0)[0], tempContour.get(index, 0)[1]);
        Core.line(frame, pt0, pt, new Scalar(255, 0, 100), 8);
        pt0 = pt;
    }
    

提交回复
热议问题