opencv中使用中點畫圓演算法

2021-08-09 16:47:37 字數 2167 閱讀 2597

假設在opencv中有乙個正方形的m*m的影象,現在要在這個影象上面畫乙個半徑m的圓。現在假設只能打點的方法來畫,則中點畫圓法是乙個很好的方法。opencv中的影象就是乙個m行m列的矩陣,座標(0,0)代表第0行第0列的點。

1 圓的方程與圓的特性

取半徑r=m/2,要畫的圓心座標是(r,r),則圓的方程是(x1-r)2+(y1-r)2=r2。選取x=x1-r,y=r-y1,則在新座標系中有x2+y2=r2。新座標系圓心位於影象的中心(r,r)處。

如下圖,當某點(x,y)在圓上時(假定圓心座標為(0,0)),則(x,-y),(-x,y),(-x,-y),(y,x),(y,-x),(-y,x),(-y,-x)都將在這個圓周上。

2 中點畫圓法

如下圖所示,考慮圓的方程x2+y2=r2,構造判別式f(x,y)= x2+y2-r2,當某點在圓上時,f(x,y)=0;當某點在圓內時,f(x,y)<0;當某點在圓外時,f(x,y)>0。依據圓的八分法特性,只要畫出圓在第一象限中的上半部分。設某點p(xi,yi)在圓周上,要取的新點只會是p1(xi+1,yi)或者p2(xi+1,yi-1),p1和p2的中點為m(xi+1,yi-0.5),當f(xi +1, yi – 0.5)< 0時,m點在圓內,說明p1點離實際圓弧更近,應該取p1作為圓的下乙個點。同理分析,當f(xi + 1, yi – 0.5)> 0時,p2離實際圓弧更近,應取p2作為下乙個點。當f(xi + 1, yi – 0.5)= 0時,p1和p2都可以作為圓的下乙個點,演算法約定取p2作為下乙個點。

現在將m點座標(xi+ 1, yi–0.5)帶入判別函式f(x,y),得到判別式d:

d= f

(xi+1, yi–0.5)= (xi+1)2+(yi–0.5)2–r2

d』=f

(xi+2, yi–0.5)= (xi+2)2+(yi–0.5)2–r2

展開後將d帶入可得到判別式的遞推關係:

d』=d + 2xi+3

d』=f

(xi+2, yi–1.5)= (xi+ 2)2+(yi–1.5)2–r2

展開後將d帶入可得到判別式的遞推關係:

d』= d + 2(xi-yi)+5

特別的,在第乙個象限的第乙個點(0, r)時,可以推倒出判別式d的初始值d0:

3 貼出程式

#include

#include

using

namespace cv;

//此程式對於

opencv3

版需要額外包含標頭檔案:

#include

#define window_name1 "

【繪製圖1】

"//為視窗標題定義的巨集

#define window_name2 "

【繪製圖2】

"//為視窗標題定義的巨集

#define window_width 600//

定義視窗大小的巨集

void drawline( mat img, point start, point end );//

繪製線段

void mp_circle(mat img,intr);

int main( void )

void drawpoint(mat img,point pt)

void mp_circle(mat img,intr)

else

x++;

drawpoint(img,point(x+r , r-y));

drawpoint(img,point(x+r,r+y));

drawpoint(img,point(-x+r,r-y));

drawpoint(img,point(-x+r,r+y));

drawpoint(img,point(r-y,x+r));

drawpoint(img,point(r+y,x+r));

drawpoint(img,point(r-y,-x+r));

drawpoint(img,point(r+y,-x+r));}}

效果如圖:

mfc DDA演算法 中點畫線演算法函式

直線的端點座標 x0,y0 x1,y1 void cquhongjuanview draw line dda cdc pdc,int x0,int x1,int y0,int y1 double y y0 for int x x0 x x1 x double x x0 for int y y0 y ...

如何計算交點畫圓 滴定管如何正確使用

滴定分析又叫容量分析,是將一種已知準確濃度的標準溶液滴加到被測定物質的溶液中,直到被測定物質與所加標準溶液完全反應為止,然後根據標準溶液的所用體積和濃度計算出物質的含量。液體體積的精密測量,是滴定分析的重要操作,是獲得良好分析結果的重要因素,為此,必須了解如何正確使用容量分析儀器。根據長度和容積的不...

在Visual C 中使用openCV

新建c 工程後,在工程屬性的vc directories中的include directories裡新增c opencv build include。也可以在c 下的additional include directories裡新增。在library directories裡新增c opencv b...