在OpenCV中找到两个梯形的相交面积
Find intersecting area of two trapezoids in OpenCV
我正在编写一个函数来评估两个非等腰梯形之间有多少像素重叠。在我的应用程序中,梯形总是定义为:
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 结构有一个交集运算符,但是我不确定是否有任何函数可以在这种情况下提供帮助。
在这种情况下要获得最佳性能的解决方案是什么?
在两个矩阵中使用CV_FILLED
或fillPoly
并逻辑地AND绘制梯形或多边形。交叉区域为:
int area_int = countNonZero(bitwise_and(TrapeZoidMatA,TrapeZoidMatB));
我认为在这种情况下这会更有效。
我正在编写一个函数来评估两个非等腰梯形之间有多少像素重叠。在我的应用程序中,梯形总是定义为:
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 结构有一个交集运算符,但是我不确定是否有任何函数可以在这种情况下提供帮助。
在这种情况下要获得最佳性能的解决方案是什么?
在两个矩阵中使用CV_FILLED
或fillPoly
并逻辑地AND绘制梯形或多边形。交叉区域为:
int area_int = countNonZero(bitwise_and(TrapeZoidMatA,TrapeZoidMatB));
我认为在这种情况下这会更有效。