1
我正在寫一個函數來評估兩個非等腰梯形之間有多少像素重疊。在我的應用程序,梯形總是被定義爲:在OpenCV中找到兩個梯形的相交區域
typedef std::array<cv::Point, 4> Trapezoid;
//[0] - bottom left
//[1] - bottom right
//[2] - top right
//[3] - top left
此外,這些梯形將具有性質索引[0]和[1]將始終具有相同的Y如將[2]和[3] (總是平行於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結構有一個交點運算符,但我不確定是否有任何函數可以幫助解決這種情況。
這種情況下最佳性能的解決方案是什麼?
非常好的建議,謝謝!我認爲至少這會使代碼變得最簡單。 – DrTarr