2016-10-25 94 views
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結構有一個交點運算符,但我不確定是否有任何函數可以幫助解決這種情況。

這種情況下最佳性能的解決方案是什麼?

回答

1

兩個矩陣和它們在邏輯上使用CV_FILLED繪製梯形或多邊形。路口的地區是:

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

我認爲這將是在這種情況下,很多有效的。

+1

非常好的建議,謝謝!我認爲至少這會使代碼變得最簡單。 – DrTarr