專案記錄 處理兩個相交圓方法探索1

2021-07-31 05:36:06 字數 1972 閱讀 1807

問題:

原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。

方法:

先使用邊緣點計算出新的中心點的座標b,保留相距中心點的最短距離radius。

如果中心點座標a和b點的距離超過了radius,則認為當前圖中存在兩個相交的圓,需要對邊

緣做進一步的處理。

依據中心點座標a得到相對於b點的對稱點a』即為交疊圓的圓心。

重新計算所有的邊緣點距離新圓心a』的距離,如果該點距離a』比距離a更近,則認為該點在以

a』為圓心的圓形上,需要從邊緣點集合中剔除掉該點。

#include

#include

bool cvcircle(uchar *pcontourmask, vector

& veccontour, int swidth, int sheight)

//計算整個邊界的新的中心位置,和真正的中心位置的偏移量是否達到了最小半徑

newx /= num;

newy /= num;

int diffx = newx-centerx;

int diffy = newy-centery;

int dis = diffx*diffx+diffy*diffy;

/*如果新的center與中心相距超過最小距離,

則認為存在第二個圓,否則直接退出不做處理*/

if(dis<=mindis) return

false;

//依據center計算另乙個圓心

int movx=newx+diffx;

int movy=newy+diffy;

//如果某個邊緣點距離新圓心更近,則剔除掉此點

stack

delpt;

int label=0;

vector

endpt;

for(int i=0;iint diffx=veccontour[i].x-movx;

int diffy=veccontour[i].y-movy;

int dis=diffx*diffx+diffy*diffy;

if(dis//如果label==0,表示從邊界起點開始,此處待改進

if(label==0) printf("0需要移除\n");

//如果等於1,表示此前是有帶保留段的

else

if(label==1)

}else

}else

if(label==2)}}

while(!delpt.empty())

if(label==2)

int insertindex=0;

for(int i=0;iif(veccontour[i].x==endpt[0].x && veccontour[i].y==endpt[0].y)

insertindex=i+1;

}//三個點:endpt[0],,endpt[1]

pt2d newpt=;

endpt.insert(endpt.begin()+1,newpt);

//三個點確定一段弧

pt2d temp=endpt[0];

vector

insertpt;

for(int j=0;j<2;j++)

if(j==0)

insertpt.push_back(newpt);

}veccontour.insert(veccontour.begin()+insertindex,insertpt.begin(),insertpt.end());

memset(pcontourmask,0,swidth*sheight);

for(vector

::iterator it=veccontour.begin();it!=veccontour.end();it++)

return

true;

}

專案記錄 處理兩個相交圓方法探索2

問題 原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。方法 使用之前的方法還存在乙個隱蔽的問題是,之前的方法假設了邊緣上的第乙個點絕對是正確的。但是在實際情況中,第乙個點不一定可以作為正確點。所以在之前的方法的基礎上還要做一 下改進。中標記圓弧進入...

專案記錄 處理兩個相交圓方法探索3

問題 原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。方法 使用之前的方法刪除錯誤的邊緣點之後,餘下的點中還存在偏離的點需要進一步修正。由於邊界的起點不一定正確,所以先遍歷邊界點,找出離中心最近的點,從該點出發來查詢待 修正的點。判斷是否需要修正的...

C 判斷兩個圓是否相交

定義乙個point類,其屬性包括點的座標,提供計算兩點之間距離的方法 定義乙個圓circle類,其屬性包括圓心和半徑 建立兩個圓形物件,提示使用者輸入,判斷兩圓是否相交。include include using namespace std class point double getdist co...