問題:
原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。
方法:
使用之前的方法還存在乙個隱蔽的問題是,之前的方法假設了邊緣上的第乙個點絕對是正確的。
但是在實際情況中,第乙個點不一定可以作為正確點。所以在之前的方法的基礎上還要做一
下改進。
**中標記圓弧進入哪一段的標記變數label的變化情況主要有以下三種,
label從1變為2時記錄下圓弧的起點,
label從2變為3時記錄下圓弧的終點。
如果第0個邊緣點距離中心太遠,則把label設為-1,
label從-1變為1時記錄下圓弧的起點,
label從1變為2時記錄下圓弧的終點。
如果遍歷完邊緣點之後只得到了乙個端點,則預設第0點是圓弧的終點。
本次改進的方法中新增了標記值-1來表示第0個邊緣點需要剔除的情況。
最終的實踐效果較好。
**如下:
#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;
}
專案記錄 處理兩個相交圓方法探索1
問題 原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。方法 先使用邊緣點計算出新的中心點的座標b,保留相距中心點的最短距離radius。如果中心點座標a和b點的距離超過了radius,則認為當前圖中存在兩個相交的圓,需要對邊 緣做進一步的處理。依據...
專案記錄 處理兩個相交圓方法探索3
問題 原圖中存在兩個部分重疊的圓,多餘的圓會影響邊緣提取的正確度,所以需要從邊緣中去掉另乙個交疊圓上的點。方法 使用之前的方法刪除錯誤的邊緣點之後,餘下的點中還存在偏離的點需要進一步修正。由於邊界的起點不一定正確,所以先遍歷邊界點,找出離中心最近的點,從該點出發來查詢待 修正的點。判斷是否需要修正的...
C 判斷兩個圓是否相交
定義乙個point類,其屬性包括點的座標,提供計算兩點之間距離的方法 定義乙個圓circle類,其屬性包括圓心和半徑 建立兩個圓形物件,提示使用者輸入,判斷兩圓是否相交。include include using namespace std class point double getdist co...