2012-11-29 3 views
2

으로 삼각형을 이미지에서 사각형을 감지 나는이 image 있습니다OpenCV의

을 그리고 난이 이미지에서 삼각형과 사각형을 꺼내합니다. 나는 2 개의 알고리즘을 가지고 있는데 하나는 삼각형이고 다른 하나는 사각형의 코드이다. 그러나 그들은 매우 유사합니다. 그러나 이런 식으로 나는 더 밝은 삼각형 만 꺼낼 수 있습니다. 누구든지 제발 도와 줄 수 있어요. 나는 이력서 :: matchShapes 기능을 사용하고 생각할 수

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

한 아이디어 (I 대신 IPL 이미지의 매트와 CV2 라이브러리를 사용하는 것이 좋습니다). matchShapes는 탐지하려는 객체의 매트와 비교할 객체의 매트를 가져옵니다. 따라서 귀하의 경우에는 삼각형과 사각형의 윤곽선 매트를 만들고 검색중인 이미지의 각 윤곽선과 해당 이미지를 비교할 수 있습니다.

개체가 정적이어서 템플릿 매칭을 간단히 수행하는 것도 좋습니다. 체크 아웃 cv :: matchTemplate 및 위의 단락과 거의 같은 아이디어.

+0

답장을 보내 주셔서 감사합니다. 지금 나는 위대한 C++ 마스터가 아니기 때문에 IplImage를 고수 할 것입니다. 그리고 그것은 내가 혼란스럽게 많은 변화를 만들 것입니다. 지난 달에 작성한 제 코드 .. 저는 파이썬을 2 개월 만에 C++로 시험 할 것입니다. 저는 cv :: matchTemplate이 제 코드가 다른 이미지, 크기 및 회색 색상의 삼각형과 사각형을 감지해야하므로 작동하지 않을 것이라고 생각합니다. 내가 끝낸 것은 원래 코드와 동일하지만 cvInRangeS, cvFindContours 및 cvApproxPoly를 사용했습니다. 그것은 효과가 있었지만 객체의 회색 색상이 바뀌면 작동하지 않습니다. –

0

대략적인 폴리는 입니다.이면 윤곽이 완벽하다는 것을 확신 할 수 있습니다. 등고선이 정사각형이지만 닫히지 않으면 근사 후 4 개의 선분과 3 개의 모서리가있는 선이됩니다.

다른 해결책은 등고선 포인트 주위에 상자를 맞추고 (이 작업을 수행하는 기능이 있음) 너비/높이 비율을 확인하십시오. 그런 다음 형상 목록에서 개별 선분을 테스트하여 상자 측면과 일치하는지 확인할 수 있습니다.

+0

당신 말이 맞아요. 그게 문제 야. 내가 끝낸 것은 Eddie E의 대답에있다. Massey III abose –