2016-10-25 19 views
1

私は、2つの非等脚台形の間にいくつのピクセルが重なるかを評価する関数を書いています。私のアプリケーションでは、台形は、常に次のように定義される。またOpenCVで2台の台形の交差する領域を見つける

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軸に平行)。

それでは、私は2つの台形を持っているとしましょう:

//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) }; 

私は台形の1の各行を反復し、その行の重複でのピクセル数を把握するために数学を行うことができます:

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 2つのマトリックス内とを使用して台形やポリゴンを描画し、。交差点のエリアは以下のとおりです。

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

私はこれが、この場合には非常に効率的だと思います。

+1

非常に良い提案、ありがとうございます!私は少なくともこれがコードを最も単純にすると思います。 – DrTarr

関連する問題