影象處理.surf,演算法,影象處理
阿新 • • 發佈:2019-02-14
在對surf編碼完成之後,對surf進行改進。將影象在鄰域內相交的特徵點連線起來。
兩兩比較特徵點的半徑(scale)之和r與其距離d的大小。若d小於r,說明這個特徵點有交集,連線兩個特徵點,否則,沒有交集。
加入的程式碼如下:
void getPointRelation(IplImage *img,std::vector<Ipoint> &ipts) { int i=0,j=0; int n=ipts.size(); float d=0,r=0; float s1=0,s2=0; Ipoint *pt1,*pt2; int r1, c1, r2, c2; std::vector<Ipoint>::iterator t1,t2; for(i=0;i<n;++i) { pt1=&ipts.at(i); //d=getLenth(pt->x); for(j=i+1;j<n;++j) { pt2=&ipts.at(j); d=getLenth(pt1->x,pt1->y,pt2->x,pt2->y); //兩點之間的距離; r=pt1->scale+pt2->scale; //兩點的半徑總長 r=r*2.5f; //此處困擾了我好幾天! if(d<=r) //若半徑之和大於距離,則兩圓有相交,則用直線連線這兩個圓 { c1=fRound(pt1->x); r1=fRound(pt1->y); c2=fRound(pt2->x); r2=fRound(pt2->y); cvLine(img, cvPoint(c1, r1), cvPoint(c2, r2), cvScalar(0, 255, 0)); } } } } float getLenth(float x1,float y1,float x2,float y2) //計算兩點之間的距離 { float d; d=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); d=sqrt(d); return d; }
這樣通過main函式呼叫getPointRelation函式就可是實現功能啦。
只是有一點需要注意,在進行當初進行影象顯示的時候為了是特徵點顯示的更明顯,我們在顯現特徵點時將其半徑進行加權,也就是乘以2.5。因此在影象中顯現的特徵點的半徑是加權之後的半徑。所以在比較d與r時,我們需要r=r*2.5。,或者是顯示影象的時候不把半徑放大2.5倍。否則就會出現明明圖片上面的圓有交集但是卻沒有連線的尷尬情況!(這個問題困擾了我好幾天)。
最終的結果圖: