Java使用opencv计算两个多边形交并比IOU、重叠面积占比

opencv引入配置看这里https://blog.csdn.net/angelpaiy/article/details/126870213

需要引入的opencv类

import org.opencv.core.Scalar;
import org.opencv.core.Point;
import org.opencv.core.Mat;
import org.opencv.core.Core;
import org.opencv.core.MatOfPoint;
import org.opencv.imgproc.Imgproc;

实现基本原理是使用opencv创建空白的Mat,然后使用多边形分别填充Mat,统计非空像素值,得出单个多边形面积。同时使用两个多边形填充空白Mat,即可得出两个多边形的并集。

交集面积 = 多边形1面积+多边形2面积-并集面积

Integer interArea = areaArea + boxArea - unionArea;

IOU = 交集面积/并集面积;

      /** 如果需要计算交并比,使用这行*/
      Float IOU = interArea*1.0f/unionArea));

示例代码中返回值为box与area重叠面积 占box面积的比值

/***交集占box面积比例为*/
float interBox = interArea*1.0f/boxArea;

完整代码如下

    /**

     * @param areaPoints: 关注区域多边形顶点坐标集合
     * @param boxPoints: 识别返回box框四个顶点坐标集合
     * @param imageWidth: 图片的最大像素宽
     * @param imageHeight: 图片的最大像素高
     * @return: Float: 识别框与关注区域重叠面积 与 识别框自身面积的占比 ,
     *                 取值范围 0-1.0,其中0表示识别框不在关注区域内部,1表示识别框被关注区域完全包围。
     *                 使用时可根据实际情况取阀值,例如返回0.5以上判定为目标物在关注区域内。
     */
    private static Float  CalculatingIntersectionOfPolygons(List areaPoints,List boxPoints,
                                                            Integer imageWidth,Integer imageHeight ){
        Integer rows = imageWidth;
        Integer cols = imageHeight;

        Scalar s0 = new Scalar(1,0,0);
        //关注区域面积
        Mat img = Mat.zeros(rows, cols, 2);
        MatOfPoint areaMat = new MatOfPoint();
        areaMat.fromList(areaPoints);
        Imgproc.fillConvexPoly(img,areaMat,s0);
        Integer areaArea = Core.countNonZero(img);
        //box面积
        Mat img1 = Mat.zeros(rows, cols, 2);
        MatOfPoint boxMat = new MatOfPoint();
        boxMat.fromList(boxPoints);
        Imgproc.fillConvexPoly(img1,boxMat,s0);
        Integer boxArea = Core.countNonZero(img1);
        //并集面积计算
        Imgproc.fillConvexPoly(img1,areaMat,s0);
        Integer unionArea = Core.countNonZero(img1);
        //交集面积计算
        Integer interArea = areaArea + boxArea - unionArea;
        /** 如果需要计算交并比,使用这行*/
//      Float IOU = interArea*1.0f/unionArea));

        /***交集占box面积比例为*/
        float interBox = interArea*1.0f/boxArea;
        return interBox;
    }

参考python版本: zhuanlan。zhihu。com/p/121065301

有更好的实现方法欢迎留言交流

你可能感兴趣的:(java+cv,opencv,java,算法)