2011-08-31 36 views
19

Resimdeki köşeleri bulmaya çalışıyorum, konturlara ihtiyacım yok, sadece 4 köşeyi. 4 köşeyi kullanarak perspektifi değiştireceğim.OpenCv kullanarak bir görüntüde köşeler nasıl bulunur

Opencv kullanıyorum, ancak köşeleri bulmak için hangi adımları kullanacağımı bilmem gerekiyor.

Resimlerim böyle olacak: enter image description here

EDITED (kırmızı noktalar olmadan, ben sonra noktaları boyamak olacaktır): önerilen adımlardan sonra

, kodu writed: (Not: -herhalde- saf OpenCv kullanmam, javaCV kullanıyorum, ama mantık aynıdır).

// 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 hereenter 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

//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); 
Yani, Cornes bulmak istiyorum, ama köşeler cvCornerHarris ve diğerleri gibi işlev nasıl kullanılacağını bilmiyorum.

+3

OpenCV yönettiği "köşe" senin sandığın şekilde köşeleri bulmuyorum fonksiyonları - kabaca konuşmak gerekirse, önemli yatay ve dikey değişime sahip alanları bulurlar. OpenCV'deki köşe işlevlerinin amacı, görsel izleme için yararlı olacak olan görüntünün ayırt edici kısımlarını bulmaktır; bu, genellikle köşe olarak düşündüğümüz şeyler değildir. –

+0

http://stackoverflow.com/a/14368605/1832154 adresindeki tam kod (resminiz yeterince küçük olduğundan, yeniden boyutlandırma bölümü dışında) http://i.imgur.com/hMdAlHX.png – mmgp

cevap

22

Öncelikle, OpenCV dağıtımında /samples/c/squares.c göz atın. Bu örnek bir kare algılayıcı sağlar ve köşe benzeri özelliklerin nasıl tespit edileceği konusunda oldukça iyi bir başlangıç ​​olmalıdır. Ardından, OpenCV'nin cvCornerHarris() ve cvGoodFeaturesToTrack() gibi özellik odaklı işlevlerine bakın.

Yukarıdaki yöntemler, gibi birçok köşeye benzer özellikleri döndürebilir - çoğu sizin aradığınız "gerçek köşeler" olmayacaktır. Benim uygulamamda, döndürülmüş veya eğrilmiş (perspektif nedeniyle) kareleri tespit etmek zorunda kaldım. (CvCvtColor)

  • Pürüzsüz (cvSmooth)
  • Eşik (cvThreshold)
  • Algılama kenarları (cvCanny)
  • konturlar (cvFindContours) bul gri tonlara RGB den

    1. dönüştürme: My algılama boru hattı oluşuyordu konturlar posses polygonalized etmişti: yapılardı doğrusal özellikler (cvApproxPoly)
    2. Bul "dikdörtgenler" ile
    3. Yaklaşık konturlar 4 puan, yeterli alan vardı, bitişik kenarları ~ 90 derece vardı, "zıt" köşeleri arasındaki mesafe yeterli büyüklükte idi, vb.

    Aşama 7 gerekliydi çünkü biraz gürültülü bir görüntü poligonalizasyondan sonra dikdörtgen görünen birçok yapıya neden olabilir. Benim başvurumda, içinde görünen kare benzeri yapılarla uğraşmak zorunda kaldım ya da istenen kareyi örtüştüm. Uygun dikdörtgeni ayırt etmede yardımcı olmak için konturun alan özelliğini ve ağırlık merkezini buldum.

  • +0

    Adım 7 ile küçük bir yardıma ihtiyacım var, cvCornerHarris'i nasıl kullanacağım, örneğimle, düzenlenmiş yayını gör, bana yardım edebilir misin? – Ricardo

    +1

    cvSmooth bir Gaussian bulanıklığı gibi bir şey mi? Sonucu cvCanny'den dilate ediyor musunuz? Konturları yaklaşık olarak nasıl tahmin edersiniz, 5 köşeyi (gölgeler yüzünden deforme olmuş kare vb.) Veya küçük bir sırt ile suqares diyelim. Yaklaşımınız yapmak istediğim şeyden çok, ama çok zorluyorum. Bazı kod örnekleri verebilir misiniz? Çok yardımcı olurdum. – sschrass

    7
    +0

    -up, ve sudoku kapmak blog biraz rehash: Kenarları bulmak yoluyla köşeleri bulmaya çalışın. Eşikteki görüntünüzle başlayın, belirgin düz çizgiler bulun (hough) ve kesiştiği yerleri arayın. Köşelerinizin olduğu yer burası. –

    0

    açıkgöz görüntüye houghlines uygula - Eğer noktaları

    bu setine dışbükey gövdeyi uygulamak noktaları bir listesini alacak
    İlgili konular