2012-11-29 167 views
2

我有這個image檢測三角形,從圖像的矩形與OpenCV的

,我想拿出從圖像的三角形和矩形。我有2個算法,一個用於三角形,另一個用於下面代碼中的矩形。但他們非常相似。但通過這種方式,我只能將三角形變得更明亮。任何人都可以幫助我。

IplImage* DetectAndDrawTriang(IplImage* img){ 
    CvSeq* contours; 
    CvSeq* result; 
    CvMemStorage *storage = cvCreateMemStorage(0); 
    int d=30; 

    IplImage* ret = cvCreateImage(cvGetSize(img), 8, 3); 
    IplImage* temp = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); 
    cvSet(ret,cvScalar(0,0,0)); 
    cvCvtColor(img, temp, CV_BGR2GRAY); 
    cvThreshold(temp, temp, 180, 255, CV_THRESH_BINARY); 
    //cvSmooth(temp, temp, CV_GAUSSIAN, 9, 9, 0,0); 
    cvNamedWindow("thre"); 
    cvShowImage("thre", temp); 

    cvFindContours(temp, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 

    while(contours) 
    { 
     result = cvApproxPoly(contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.1, 0); 
     if(result->total==3) 
     { 
      CvPoint *pt[3]; 
      for(int i=0;i<3;i++) 
       pt[i] = (CvPoint*)cvGetSeqElem(result, i); 


      if((int)sqrt((pt[0]->x-pt[2]->x)*(pt[0]->x-pt[2]->x)+(pt[0]->y-pt[2]->y)*(pt[0]->y-pt[2]->y))>=d && (int)sqrt((pt[0]->x-pt[1]->x)*(pt[0]->x-pt[1]->x)+(pt[0]->y-pt[1]->y)*(pt[0]->y-pt[1]->y))>=d && (int)sqrt((pt[1]->x-pt[2]->x)*(pt[1]->x-pt[2]->x)+(pt[1]->y-pt[2]->y)*(pt[1]->y-pt[2]->y))>=d) 
      { 
       cvLine(ret, *pt[0], *pt[1], cvScalar(255,255,255)); 

       cvLine(ret, *pt[1], *pt[2], cvScalar(255,255,255)); 

       cvLine(ret, *pt[2], *pt[0], cvScalar(255,255,255)); 
      } 
     } 
     contours = contours->h_next; 
    } 

    cvReleaseImage(&temp); 
    cvReleaseMemStorage(&storage); 

    return ret; 

} 
+0

你是指什麼意思? –

+0

只能放入另一幅圖像中的三角形和矩形。對不起,我的英語:P –

回答

2

一個想法我能想到的是使用CV :: matchShapes功能(我建議使用帶墊代替IPL圖像CV2庫)。 matchShapes將要檢測的對象的Mat以及要與之進行比較的對象的Mat放在一起。因此,對於您的情況,您可以製作三角形和正方形輪廓的Mat,並將這些圖像與正在搜索的圖像中的每個輪廓進行比較。

因爲對象是靜態的,所以你也可以考慮簡單地做模板匹配。查看cv :: matchTemplate,和上面的段落幾乎一樣。

+0

感謝您的回覆。現在我會堅持使用IplImage,因爲我不是一個很棒的C++主人。它會讓我很困惑改變我的代碼,我做了最後幾個月..我想我會嘗試python在幾個月insk C++。 我不認爲cv :: matchTemplate會工作,因爲我的代碼必須檢測不同圖像,尺寸和灰色的三角形和矩形。 我最終做的和我原來的代碼一樣,但是我使用了cvInRangeS,cvFindContours和cvApproxPoly。它很有效,但如果objetcs的灰色顏色發生變化,它將不起作用。 –

0

ApproxPoly是一個很好的解決方案如果您可以確定您的輪廓是完整的。 如果輪廓是正方形但沒有關閉,那麼在接近之後它將是具有四個線段和三個拐角的線。

另一種解決方法是在輪廓點周圍安裝一個盒子(有一個功能可以做到這一點)並檢查寬度/高度比率。然後,您可以測試輪廓列表中的各個線段,以查看它們是否與箱子側面匹配。

+0

你說得對。這是一個問題。 我最終做的是在我的回答埃迪馬斯三世退出 –