2017-12-06 24 views
2


私は言葉の絵を持っています。各単語は長方形の輪郭で囲まれています。私はそれにいくつかの操作を行うことができるように、ソートされる長方形の輪郭ベクトルが必要です。長方形の輪郭をソートするopencv

単語の絵があります(等高線あり)。私も、私はそれをソートするために試してみました、私の比較関数が

bool my_compare(Rect2d rect1, Rect2d rect2) 
{ if(((rect1.tl().y) <= rect2.tl().y) &&(rect1.tl().y < rect2.br().y)) 
    return (rect1.tl().x < rect2.tl().x); 
    return (rect1.tl().y < rect2.tl().y); 
} 

ある image with contours

結果が正しくソートされていない

if((rect1.tl().y == rect2.tl().y)) 
    return (rect1.tl().x < rect2.tl().x); 
    return (rect1.tl().y < rect2.tl().y); 

これを試してみました(それは非常に左上から開始doesntのか開始しますが、同じ行の輪郭をスキップします)。

+0

0と1の間それがあるべき、と私はそれをあなたの方法を行うのと思ったけど。 .iはそれがもっと簡単な方法で、とにかくありがとう! –

答えて

1

おそらく、同じ行の矩形の高さが異なるためです。長方形の後に同じ行の背の高い矩形が続いているとすると、背の高い矩形は左の矩形より早くソートされます。

+--------------> x 
|   ****   
| ****  * * 
| * *  * * 
| ****  **** 
| rect1 rect2 
v 
y 

あなたの最初の比較関数を使用して、rect1.tl().y <= rect2.tl().yがfalseでrect1.tl().y < rect2.br().y)が真である、したがってこれは克服するために左に1つの

1つの提案よりも右側の長方形小さい置かれる(rect1.tl().y < rect2.tl().y)を返す長方形左上場合yのコーナー差が閾値内にある場合、それらが同じ行にあり、代わりにxで比較されると考えてください。

bool my_compare(Rect2d rect1, Rect2d rect2) 
{ 
    if (fabs(rect1.tl().y - rect2.tl().y) < threshold) 
     return (rect1.tl().x < rect2.tl().x); 
    return (rect1.tl().y < rect2.tl().y); 
} 

fabs<cmath>下浮動小数点絶対値関数です。閾値を計算する1つの方法は、矩形の平均高さを用いることである。

threshold = ((rect1.br().y - rect1.tl().y) + (rect2.br().y - rect2.tl().y))/2 * K; 

Kは、あなたが最良の実行かを確認するために試すことができた定数であり、それはしきい値法で働いている

+0

はい、私は最初のコードで、この行を "buttom right point(br。())"を使って処理しようとしました:if((rect1.tl()。y)<= rect2.tl()。y) &&(rect1.tl()。y

+0

私はあなたの最初の比較が失敗した理由を説明するために私の答えに例を追加しました – lamandy

+0

うまくいきました。 –