我無法在任何地方找到此答案,我希望有人能幫助我。使用C++在opencv 2.3中放大並限制四邊形多邊形
我有一個圖像(全黑),裏面有一個白色的通用四邊形多邊形,以及這個多邊形的對應4角座標。
我需要找到略微放大的四邊形的角點,稍微減小一點的角點(形狀必須相同,只是圖像內四邊形的大小調整)。
是否有一個允許我這樣做的函數,還是我應該手動計算一些幾何?
謝謝你的幫助。
我無法在任何地方找到此答案,我希望有人能幫助我。使用C++在opencv 2.3中放大並限制四邊形多邊形
我有一個圖像(全黑),裏面有一個白色的通用四邊形多邊形,以及這個多邊形的對應4角座標。
我需要找到略微放大的四邊形的角點,稍微減小一點的角點(形狀必須相同,只是圖像內四邊形的大小調整)。
是否有一個允許我這樣做的函數,還是我應該手動計算一些幾何?
謝謝你的幫助。
考慮多邊形的一個頂點p,它的前一個p1和後一個p2。
這些點之間的矢量是
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意味着收縮。
你想要的是多邊形偏移量。如果你想使用現有的庫。考慮使用Clipper
void OffsetPolygons(const Polygons &in_polys,
Polygons &out_polys,
double delta,
JoinType jointype = jtSquare, double MiterLimit = 2.0);
該功能由「增量」量抵消「多邊形」的多邊形參數。正三角洲值展開外部多邊形並收縮內部'洞'多邊形。消極的三角洲正好相反。
雖然我必須添加一個像Quadrilateral這樣簡單的幾何體,但很容易從頭開始。
只是要小心的角落案件。當你偏移一個非常小的四邊形時。它將成爲偏移量的三角形。
謝謝,但我寧願只使用opencv,不要使用外部庫。你所說的幾何實現在任何情況下都不起作用:例如,當四邊形有一個幾乎垂直的邊時,這意味着非常高(或低)的斜率,因此極高(或低)的截距y軸,計算這種截距的微小變化並不會影響平行線。所以我應該在這種情況下使用動態偏移。 我使用了Jiri解釋的矢量實現。有效。 – imby
吉日的案件不處理我在我的答案中提到的角落案件。我不確定我瞭解你提到的情況。 –
是的,但在我的情況下,我不必處理小邊緣。使用Clipper庫的解決方案將是完美的,但我應該只使用opencv庫。 處理所有的平行線,然後計算交點有點長,而矢量實現只需要10行C++代碼。 但是,無論如何,謝謝你的幫助。 – imby
非常感謝。它能夠工作,而且工作非常緊湊。 – imby
四邊形的邊緣之一非常小時,不處理這種情況。所以一個內部實際上是一個三角形。用這種方法你會得到一個數字8 –