OpenCV C+中两个椭圆重叠的IOU+; < >我在寻找一些C++内置或实现的函数,根据IOU(交叉点上的交)计算两个椭圆重叠。Jaccard系数,我发现它在新版本的OpenCV下很明显地被实现了。 static inline float rotatedRectIOU(常量RotatedRect&a,常量RotatedRect&b) { std::向量间; int res=旋转直角交点(a、b、inter); if(inter.empty()| | res==INTERSECT_NONE) 返回0.0f; 如果(res==完全相交) 返回1.0f; 浮动面积=轮廓面积(面积); 返回interrea/(a.size.area()+b.size.area()-interrea); }

OpenCV C+中两个椭圆重叠的IOU+; < >我在寻找一些C++内置或实现的函数,根据IOU(交叉点上的交)计算两个椭圆重叠。Jaccard系数,我发现它在新版本的OpenCV下很明显地被实现了。 static inline float rotatedRectIOU(常量RotatedRect&a,常量RotatedRect&b) { std::向量间; int res=旋转直角交点(a、b、inter); if(inter.empty()| | res==INTERSECT_NONE) 返回0.0f; 如果(res==完全相交) 返回1.0f; 浮动面积=轮廓面积(面积); 返回interrea/(a.size.area()+b.size.area()-interrea); },c++,opencv,overlap,ellipse,C++,Opencv,Overlap,Ellipse,因为我使用的是较旧的OpenCV版本,所以我只尝试复制代码,因为它似乎不依赖于任何其他资源。代码运行非常平稳。然而,结果是惊人的错误,我不知道为什么 btw,这是旋转矩形的IoU,不是椭圆,但不是cv::RotatedRect是cv::fitEllipse()返回的吗?不应该是好的吗?是的,但是椭圆被刻进了那个矩形。所以不,这不好,那么为了计算椭圆的IoU,我应该遵循什么公式或函数呢?有什么建议吗?这可不是小事。最简单的方法是在两个不同的黑色图像(大小相同)上绘制白色椭圆,并计算它们共有的白色像

因为我使用的是较旧的OpenCV版本,所以我只尝试复制代码,因为它似乎不依赖于任何其他资源。代码运行非常平稳。然而,结果是惊人的错误,我不知道为什么


btw,这是旋转矩形的IoU,不是椭圆,但不是
cv::RotatedRect
cv::fitEllipse()返回的吗?不应该是好的吗?是的,但是椭圆被刻进了那个矩形。所以不,这不好,那么为了计算椭圆的IoU,我应该遵循什么公式或函数呢?有什么建议吗?这可不是小事。最简单的方法是在两个不同的黑色图像(大小相同)上绘制白色椭圆,并计算它们共有的白色像素数(逻辑and)。顺便说一句,这是旋转矩形的IoU,不是椭圆,但不是
cv::RotatedRect
cv::fitEllipse()
返回的吗?不应该是好的吗?是的,但是椭圆被刻进了那个矩形。所以不,这不好,那么为了计算椭圆的IoU,我应该遵循什么公式或函数呢?有什么建议吗?这可不是小事。最简单的方法是在两个不同的黑色图像(大小相同)上绘制白色椭圆,并计算它们共有的白色像素数(逻辑和)。
static inline float rotatedRectIOU(const RotatedRect& a, const RotatedRect& b)
{
    std::vector<Point2f> inter;
    int res = rotatedRectangleIntersection(a, b, inter);
    if (inter.empty() || res == INTERSECT_NONE)
        return 0.0f;
    if (res == INTERSECT_FULL)
        return 1.0f;
    float interArea = contourArea(inter);
    return interArea / (a.size.area() + b.size.area() - interArea);
}