2011-01-29 86 views
3

使用VC++和Open CV。這是我想要做的: 找到前三個近水平的霍夫線並繪製它們。 找到所有近乎垂直的線並畫出它們 如果有任何垂直線是高於水平線那麼標記設置爲0如果上面沒有垂直霍夫線(全部低於)水平線則FLAG = 0 那麼FLAG = 1如何比較Hough Line在OpenCV中的位置?

int n, i,c=0; 
    int flag = 0; 

    cvCanny(src, dst, 50, 150, 3); 
    lines = cvHoughLines2(dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 10, 5, 5); 
    n = lines->total; 

    for(i = 0; i < n; i++) 
    { 
     CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); 
     CvPoint pt1, pt2, hpt1, hpt2, vpt1, vpt2; 
     int hy = 0, vy = 0;   
     pt1 = line[0]; 
     pt2 = line[1]; 
     theta = atan((double)(pt2.y - pt1.y)/(pt2.x - pt1.x)); /*slope of line*/ 
     degree = theta*180/CV_PI; 
     if(fabs(degree) < 8) //checking for near horizontal line 
     { 
      c++; 
      if(c > 0 && c <5) /*main horizontal lines come first*/ 
      { 
       cvLine(out, pt1, pt2, CV_RGB(255, 255,255), 1, CV_AA, 0); 
       hpt1 = line[0]; 
       hpt2 = line[1]; 

       if(hpt1.y > hpt2.y) //finds out lower end-point 
        hy = hpt1.y; 
       else 
        hy = hpt2.y; 
      } 
     } 

     if(fabs(degree) > 70) /*near vertical lines*/ 
     { 
      cvLine(out, pt1, pt2, CV_RGB(255, 255,255), 1, CV_AA, 0); 

      vpt1 = line[0]; 
      vpt2 = line[1]; 

      if(vpt1.y > vpt2.y) //finds upper end-pt of vertical line 
        vy = vpt1.y; 
      else 
       vy = vpt2.y; 

      if(vy >= hy) //if vert line is lower than horizontal line 
       flag = 1; 
      else 
       flag = 0; 

     } 

    } 
    display(out, "hough lines"); 
    return flag; 
} 

然而,對於一個圖像,即使水平線-still該標誌被返回1。所以我是沿錯誤軸線計數上述檢測到的垂直線?請幫助我。

回答

4

if(fabs(degree) > 70)if(fabs(degree) < 8)行看起來不對。大約180°的角度意味着幾乎是水平的......你可能想要改變它,並且要記住角度的週期性(所以大約360也幾乎是水平的)。一種很好地處理的方法是使用if (fabs(cos(angle - desired_angle)) > 0.996),這意味着大致「如果角度和desired_angle在彼此的5度以內,不考慮方向」。 0.996大致是5度的餘弦,如果你需要它更精確的把更多的數字在那裏 - 0.9961946980917455是一個更接近的匹配。

此外,您的循環順序已關閉。在這個序列中,你不需要find the first three nearly-horizontal hough lines and draw them. find all the nearly-vertical lines and draw them if any vertical line is above the horizontal line,你可以以任何順序遍歷所有行,並獨立處理它們 - 垂直行可以在水平行之前,所以你不知道要檢查什麼。

三,

  if(hpt1.y > hpt2.y) //finds out lower end-point 
       hy = hpt1.y; 
      else 
       hy = hpt2.y; 

VS

 if(vpt1.y > vpt2.y) //finds upper end-pt of vertical line 
       vy = vpt1.y; 
     else 
      vy = vpt2.y; 

您使用相同的代碼,找到更低的協調才能找到的較高者。你認爲這可行嗎?

第四,

 if(vy >= hy) //if vert line is lower than horizontal line 
      flag = 1; 
     else 
      flag = 0; 

標誌的值取決於最後穿過這一段代碼。這與您的描述中的any不符。

+0

這是把它的保鮮盒方式,但是我得到在輸出圖像上看到精細的水平和垂直線條。問題是在主水平線上方有垂直線時拋出一個標誌。這沒有發生。 – AruniRC 2011-01-31 02:15:25

+0

在尋找其他錯誤之前,我會首先修復這些顯而易見的錯誤(它在一個映像上工作並不意味着它每次都能正常工作,並且如果它每次都需要解釋原因)。 – etarion 2011-02-01 11:11:22

1

更容易的方法是不使用PPHL(漸進概率霍夫線算法),而是使用SHL(標準HL)!這樣你就可以得到一個角度和半徑的極線形式!然後你可以檢查角度,而不需要自己計算。

如果輸出角度爲約0°或180°這是一個垂直線,並且,如果它是約90°它是一個水平行....