2011-08-31 56 views
19

我試圖找到圖像上的角落,我不需要輪廓,只需要四個角落。我會用4個角來改變視角。如何使用OpenCv在圖像上找到角落

我使用Opencv,但我需要知道步驟來找到角落和我將使用的功能。

我的圖片會是這樣:(無紅點,我會後搽點) enter image description here

編輯:

後建議的步驟,我所著的代碼(注:I'm不使用純OpenCv,我使用javaCV,但它的邏輯是一樣的)。

// Load two images and allocate other structures (I´m using other image) 
    IplImage colored = cvLoadImage(
      "res/scanteste.jpg", 
      CV_LOAD_IMAGE_UNCHANGED); 

enter image description here

IplImage gray = cvCreateImage(cvGetSize(colored), IPL_DEPTH_8U, 1); 
    IplImage smooth = cvCreateImage(cvGetSize(colored), IPL_DEPTH_8U, 1); 

    //Step 1 - Convert from RGB to grayscale (cvCvtColor) 
    cvCvtColor(colored, gray, CV_RGB2GRAY); 

enter image description here

//2 Smooth (cvSmooth) 
    cvSmooth(gray, smooth, CV_BLUR, 9, 9, 2, 2); 

enter image description here

//3 - cvThreshold - What values? 
    cvThreshold(gray,gray, 155, 255, CV_THRESH_BINARY); 

enter image description here

//4 - Detect edges (cvCanny) -What values? 
    int N = 7; 
    int aperature_size = N; 
    double lowThresh = 20; 
    double highThresh = 40;  
    cvCanny(gray, gray, lowThresh*N*N, highThresh*N*N, aperature_size); 

enter image description here

//5 - Find contours (cvFindContours) 
    int total = 0; 
    CvSeq contour2 = new CvSeq(null); 
    CvMemStorage storage2 = cvCreateMemStorage(0); 
    CvMemStorage storageHull = cvCreateMemStorage(0); 
    total = cvFindContours(gray, storage2, contour2, Loader.sizeof(CvContour.class), CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE); 
    if(total > 1){ 
      while (contour2 != null && !contour2.isNull()) { 
       if (contour2.elem_size() > 0) { 
       //6 - Approximate contours with linear features (cvApproxPoly) 
        CvSeq points = cvApproxPoly(contour2,Loader.sizeof(CvContour.class), storage2, CV_POLY_APPROX_DP,cvContourPerimeter(contour2)*0.005, 0); 
        cvDrawContours(gray, points,CvScalar.BLUE, CvScalar.BLUE, -1, 1, CV_AA); 

       } 
       contour2 = contour2.h_next(); 
      } 

    } 

enter image description here

所以,我想找到了Cornes,但我不知道如何使用的角落的功能類似cvCornerHarris等。

+3

的OpenCV的「角」功能中沒有發現你的思維方式角落 - 大致來說,他們發現橫向和縱向變化很大的區域。 OpenCV中角點函數的目標是找到圖像中與視覺跟蹤有關的特殊部分,這不一定是我們通常認爲的角點。 –

+0

http://stackoverflow.com/a/14368605/1832154上的確切代碼(除了調整大小的部分,因爲您的圖片已經足夠小)給出了http://i.imgur.com/hMdAlHX.png – mmgp

回答

22

,先看看/samples/c/squares.c在OpenCV的分佈。這個例子提供了一個正方形探測器,它應該是一個很好的開始如何檢測角落特徵。然後,看看OpenCV的面向功能的功能,如cvCornerHarris()和cvGoodFeaturesToTrack()。

上述方法可以返回許多角落特徵 - 大多數不會是你正在尋找的「真正的角落」。在我的應用程序中,我必須檢測已旋轉或傾斜的方塊(由於透視)。 My檢測管道組成的:

  1. 轉換從RGB到灰度(cvCvtColor)
  2. 平滑(cvSmooth)
  3. 閾值(cvThreshold)
  4. 檢測邊緣(cvCanny)
  5. 查找輪廓(cvFindContours)
  6. 具有線性特徵的近似輪廓(cvApproxPoly)
  7. 查找具有多邊形輪廓擁有的結構的「矩形」唱4分,足夠的面積,相鄰的邊緣約爲90度,「對面」的頂點之間的距離足夠大,等等。

第7步是必要的,因爲稍微嘈雜的圖像可以產生許多多邊形化後呈現矩形的結構。在我的應用程序中,我還必須處理出現在方框內的方形結構,或者重疊所需的方形。我發現輪廓的面積屬性和重心有助於辨別正確的矩形。

+0

我需要一點幫助,第7步,如何使用cvCornerHarris,用我的例子,看到編輯後,你能幫助我嗎? – Ricardo

+1

cvSmooth有點像高斯模糊嗎? 你是否從cvCanny擴大了結果? 你如何近似輪廓,讓我們說5個角落(變形的方形,因爲陰影等)或suqares與一個小山脊。 你的方法幾乎是我想要做的,但我非常努力。你能提供一些代碼示例嗎?會非常有幫助。 – sschrass

7
+0

作爲一個關注以及稍微重新編制sudoku grab博客:嘗試通過找到邊緣來找到角點。從你的閾值圖像開始,找到突出的直線(hough),並找出它們相交的地方。這就是你的角落所在。 –

0

應用houghlines到精明的形象 - 你會得到點 的列表應用凸包這套點