2013-05-19 38 views
0

我正在嘗試編寫圖像處理程序,但我遇到了一些問題。C++圖像處理,計算對象的角度

我設法計數形狀的場,電路(邊緣檢測)和其他一些變量,我需要。 現在我需要找出每個箭頭的角度。我正在考慮尋找一個箭頭的中心,然後將它與圖像質量中心進行比較(並且它們之間的線會是角度,我不確定它是如何完成的)。

問題是我不知道如何實現它。我可以通過設置顏色來檢測箭頭,但那隻會讓我感覺到它們的邊緣。我不知道如何找到大衆中心(在互聯網上搜索有關它的信息實際上讓我更困惑),每個箭頭的中心或如何計算角度。

你能幫我計算這些角度嗎?我不知道如何去做。

我正在使用DIBLOOK示例。我無法使用任何非標準庫。

我對這個事情目前的功能是:

void CDibDoc::ConvertToGrayImage(CView *view) 
{ 
trace("start ConvertToGrayImage\r\n");  
RGBTRIPLE* rows[500] ; 
int width, height ; 
int obwod=0; 
int pole=0; 
float w3=0.0; 
float m00, m01, m02, m20, m10, m11; 
float M01, M20, M11, M7, M02; 

if(GetDIBRowsRGB(m_hDIB,rows,&width,&height)) { 
for(int x=0;x<width;x++) 
    for(int y =0;y<height;y++) { 

     if(x<width-1 && x>0 && y<height-1 && y>0){  //count circuit, edge detection 
     if(rows[x][y].rgbtBlue != rows[x+1][y].rgbtBlue || rows[x][y].rgbtBlue != rows[x][y+1].rgbtBlue){ 
      obwod++; 
     } 
     } 

     if(rows[x][y].rgbtBlue == 0){ //count field 
     pole++; 

     m00+= 1; 
     m01+= y; 
     m02+= y*y; 
     m20+= x * x; 
     m10+= x; 
     m11=+x * y; 
     }         //counting variables for other things 
     M02 = m02 - (m01*m01)/m00; 
     M01 = m01 - (m01/m00) * m00; 
     M11 = m11-m10 * m01/m00; 
     M20 = m20 - m10*m10/m00; 
     M7 = (M20*M02 - M11*M11)/(m00*m00*m00*m00); 

    } 

FreeDIBRows(m_hDIB); 

w3 = (obwod/(2* sqrt((float)M_PI * pole))) -1; //more counting 


} 
UpdateAllViews(NULL); 

圖片帶箭頭:

enter image description here

+2

Hough變換 –

回答

0

我想這樣做的最簡單的方法是,你檢測箭頭的邊緣後,您可以輕鬆計算p1和p2的座標,它們是箭頭底部的箭頭(p1)和中點(p2)的點。假設p1座標是(x,y)和p2(x',y')。通過使用它可以計算箭頭的切線。

tan 0 = (y' - y)/(x' - x) 

所以希望這將有助於