在OpenCV

时间:2016-10-25 12:51:59

标签: c++ opencv trigonometry

我正在编写一个函数来评估两个非等腰梯形之间重叠的像素数。在我的应用程序中,梯形总是定义为:

typedef std::array<cv::Point, 4> Trapezoid;
//[0] - bottom left
//[1] - bottom right
//[2] - top right
//[3] - top left

此外,这些梯形将具有索引[0]和[1]将始终具有与[2]和[3](始终与Y轴平行)相同的Y的属性。

所以,假设我有两个梯形:

//300 high, 100 top, 200 bottom
Trapezoid trapezoid1{ cv::Point(100,400), cv::Point(300,400), cv::Point(250,100), cv::Point(150,100) };
//250 high, 50 top, 250 bottom
Trapezoid trapezoid2{ cv::Point(75,400), cv::Point(325,400), cv::Point(225,150), cv::Point(175,150) };

我可以迭代其中一个梯形的每一行并进行数学计算以确定该行中有多少像素重叠:

uint32_t TrapezoidOverlap( const Trapezoid& trapezoid1,
                           const Trapezoid& trapezoid2 )
{
    //Count number of overlapping pixels
    uint32_t overlappedpixels {0};

    for (int i = trapezoid1[3].y; i < trapezoid1[0].y; i++) {
        overlappedpixels += //Math for overlapping pixels in X;
    }

    return overlappedpixels;
}

第一行和最后一行很简单,但中间的所有行都需要三角法来找到两个梯形的起点和终点。这似乎在计算上很昂贵,性能在这个应用程序中至关重要。我在this问题中看到Rect结构有一个交集算子,但我不确定是否有任何函数可以帮助解决这种情况。

在这种情况下,最佳性能的解决方案是什么?

1 个答案:

答案 0 :(得分:1)

在两个矩阵中使用CV_FILLED fillPoly 绘制梯形或多边形,并在逻辑上使用 AND 绘制梯形或多边形。交叉区域是:

int area_int = countNonZero(bitwise_and(TrapeZoidMatA,TrapeZoidMatB));

我认为在这种情况下这会非常有效。

相关问题