2011-11-03 77 views
1

我無法在任何地方找到此答案,我希望有人能幫助我。使用C++在opencv 2.3中放大並限制四邊形多邊形

我有一個圖像(全黑),裏面有一個白色的通用四邊形多邊形,以及這個多邊形的對應4角座標。

我需要找到略微放大的四邊形的角點,稍微減小一點的角點(形狀必須相同,只是圖像內四邊形的大小調整)。

是否有一個允許我這樣做的函數,還是我應該手動計算一些幾何?

謝謝你的幫助。

回答

2

考慮多邊形的一個頂點p,它的前一個p1和後一個p2。

enter image description here

這些點之間的矢量是

v1 = p1 - p 
v2 = p2 - p 

(計算是對x分量型和y分別座標)。 在縮小的多邊形中,頂點p沿線 移動到p',該線將矢量v1和v2之間的角度α減半。 在此方向上的向量,w是

w = v1 + v2 

並且在此方向上的單位向量v是

v = w/|w| = (w_x, w_y)/sqrt(w_x*w_x + w_y*w_y) 

新點p」是

p' = p + k * v , i.e. : 
p_x' = p_x + k * v_x 
p_y' = p_y + k * v_y 

其中k爲移動距離(一個標量)。

如果頂點p是凸的(如圖中所示),那麼k> = 0意味着 收縮,而k < = 0意味着擴展。 如果頂點p是凹的,那麼k> = 0意味着 擴展,而k < = 0意味着收縮。

+0

非常感謝。它能夠工作,而且工作非常緊湊。 – imby

+0

四邊形的邊緣之一非常小時,不處理這種情況。所以一個內部實際上是一個三角形。用這種方法你會得到一個數字8 –

0

你想要的是多邊形偏移量。如果你想使用現有的庫。考慮使用Clipper

 void OffsetPolygons(const Polygons &in_polys, 
     Polygons &out_polys, 
     double delta, 
     JoinType jointype = jtSquare, double MiterLimit = 2.0); 

該功能由「增量」量抵消「多邊形」的多邊形參數。正三角洲值展開外部多邊形並收縮內部'洞'多邊形。消極的三角洲正好相反。

雖然我必須添加一個像Quadrilateral這樣簡單的幾何體,但很容易從頭開始。

  • 身份平行於自身形成的四邊形
  • 偏移線全部四個無限線
  • 這些新線
  • 的計算交集

只是要小心的角落案件。當你偏移一個非常小的四邊形時。它將成爲偏移量的三角形。

+0

謝謝,但我寧願只使用opencv,不要使用外部庫。你所說的幾何實現在任何情況下都不起作用:例如,當四邊形有一個幾乎垂直的邊時,這意味着非常高(或低)的斜率,因此極高(或低)的截距y軸,計算這種截距的微小變化並不會影響平行線。所以我應該在這種情況下使用動態偏移。 我使用了Jiri解釋的矢量實現。有效。 – imby

+0

吉日的案件不處理我在我的答案中提到的角落案件。我不確定我瞭解你提到的情況。 –

+0

是的,但在我的情況下,我不必處理小邊緣。使用Clipper庫的解決方案將是完美的,但我應該只使用opencv庫。 處理所有的平行線,然後計算交點有點長,而矢量實現只需要10行C++代碼。 但是,無論如何,謝謝你的幫助。 – imby