如何取得圓所包含的像素位置

Q: 在圖中已知一點為圓的中心點,該圓的所有像素位置為何?

A:

因為圓需滿足對稱性,故必須先計算其對稱點,假設圓的中心點為 (x, y),半徑為 r,則右上四分之一圓的對稱點為 (x + r / sqrt(2), y + r / sqrt(2))。

利用畢氏定理,該圓中 y 軸位置在 (y + n) 的像素個數為: ( n: 1 ~ r / sqrt(2) )
squrt(r2 - n2)

為了保証滿足對稱性, y 軸位置在大於於對稱點的 y 值後,其算法改由上一步驟的計算結果所推算而得。

其中 r / sqrt(2) 的除法,為了方便計算可以換算為 r * sqrt(2) / 2。

圖形表示為:


程式範例:(截取於 ORB-SLAM2 ORBextractor::ORBextractor())

umax.resize(HALF_PATCH_SIZE + 1); // HALF_PATCH_SIZE 為圓的半徑

int v, v0, vmax = cvFloor(HALF_PATCH_SIZE * sqrt(2.f) / 2 + 1); // 計算對稱點
int vmin = cvCeil(HALF_PATCH_SIZE * sqrt(2.f) / 2);

const double hp2 = HALF_PATCH_SIZE*HALF_PATCH_SIZE;
for (v = 0; v <= vmax; ++v) {
umax[v] = cvRound(sqrt(hp2 - v * v)); // 利用畢氏定理計算像素數目
}

// Make sure we are symmetric
for (v = HALF_PATCH_SIZE, v0 = 0; v >= vmin; --v) // 確保圓的對稱性
{
while (umax[v0] == umax[v0 + 1])
++v0;
umax[v] = v0;
++v0;
}




Reference




文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知,謝謝。
創作者介紹

拾人牙慧點滴

silverwind1982 發表在 痞客邦 PIXNET 留言(0) 人氣()