關於hough圓弧檢測C++程式的問題
阿新 • • 發佈:2018-11-12
需要用到一個圓弧檢測的程式,苦於網上沒有C++版的,自己根據MATLAB函式寫了一個,自己感覺沒什麼問題,編譯也可以通過,但結果就是很奇怪,求各位大咖幫忙,新手,小白一個。。。。
如上,其中註釋部分是MATLAB對應程式碼void hough_circle(IplImage *BW,double step_r,double step_angle,double r_min,double r_max,double p) { //[m,n] = size(BW); int m=BW->width,n=BW->height; int size_r = (int)((r_max-r_min)/step_r)+1; int size_angle = (int)(2*pi/step_angle); //hough_space = zeros(m,n,size_r); int l=m*n*size_r; int *hough_space=new int [l]; for(int i=0;i<l;i++) hough_space[i]=0; //[rows,cols] = find(BW); typedef struct Str { int row; int col; }Str; int SIZE=BW->height*BW->width; Str *location=new Str [SIZE]; int ecount=0;//計數,統計白點 for (int i = 0; i < BW->height; i++) { for (int j = 0; j < BW->width; j++) { char pixel = *(BW->imageData + i*BW->widthStep+j); if(pixel==255) { location[ecount].row=i; location[ecount].col=j; ecount++; } } } //ecount = size(rows); /*% Hough變換 % 將影象空間(x,y)對應到引數空間(a,b,r) % a = x-r*cos(angle) % b = y-r*sin(angle)*/ /*for i=1:ecount for r=1:size_r for k=1:size_angle a = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle)); b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle)); if(a>0&a<=m&b>0&b<=n) hough_space(a,b,r) = hough_space(a,b,r)+1; end end end end*/ int a=0,b=0; for(int i=0;i<ecount;i++) for(int r=1;r<=size_r;r++) for(int k=1;k<=size_angle;k++) { a = (int)(location[i].row-(r_min+(r-1)*step_r)*cos(k*step_angle)); b = (int)(location[i].col-(r_min+(r-1)*step_r)*sin(k*step_angle)); if((a>0)&(a<=m)&(b>0)&(b<=n)) hough_space[r*m*n+a*m+b]++; } // 搜尋超過閾值的聚集點 /*max_para = max(max(max(hough_space))); index = find(hough_space>=max_para*p); length = size(index); hough_circle=zeros(m,n);*/ int max_para=hough_space[0]; for(int i=1;i<l;i++) { max_para=max_para>=hough_space[i]?max_para:hough_space[i]; } int thre=max_para*p; int par1[LEN],par2[LEN],par3[LEN]; for (int j=0;j<LEN;j++) { par1[j]=0,par2[j]=0,par3[j]=0; } int length=0;//超過閾值的點個數 for(int i=1;i<l;i++) if(hough_space[i]>=thre) { par3[length]=i/(m*n)+1; par2[length]=(i%(m*n))/m+1; par1[length]=(i%(m*n))%m+1; length++; } int size_h=m*n; int *hough_circle=new int [size_h]; for (int i=0;i<size_h;i++) hough_circle[i]=0; /*for i=1:ecount for k=1:length par3 = floor(index(k)/(m*n))+1; par2 = floor((index(k)-(par3-1)*(m*n))/m)+1; par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m; if((rows(i)-par1)^2+(cols(i)-par2)^2<(r_min+(par3-1)*step_r)^2+5&... (rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*step_r)^2-5) hough_circle(rows(i),cols(i)) = 1; end end end*/ //par3是半徑,par1和par2是要檢測的圓的座標。 //index(k)在hough_space中的三維位置(par1,par2,par3) for(int i=0;i<ecount;i++) for (int k=0;k<length;k++) if(((location[i].row-par1[k])^2+(location[i].col-par2[k])^2<(r_min+(par3[k]-1)*step_r)^2+5)&((location[i].row-par1[k])^2+(location[i].col-par2[k])^2>(r_min+(par3[k]-1)*step_r)^2-5)) hough_circle[location[i].row*m+location[i].col] = 1; //列印結果 cout<<"圓點座標 "<<"半徑 "<<endl; for (int k=0;k<length;k++) { par3[k] = r_min+(par3[k]-1)*step_r; cout<<par1[k]<<" "<<par2[k]<<" "<<par3[k]<<endl; } }