問題:
原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。
方法:
先使用邊緣點計算出新的中心點的座標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...