2012-01-11 9 views

답변

11

. 각 윤곽 (연결된 구성 요소의 경계)은 점의 벡터로 저장됩니다. 다음은 C++의 윤곽에 액세스하는 방법은 다음과 같습니다

vector<vector<Point> > contours; 
cv::findContours(img, contours, cv::RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); 
for (size_t i=0; i<contours.size(); ++i) 
{ 
    // do something with the current contour 
    // for instance, find its bounding rectangle 
    Rect r = cv::boundingRect(contours[i]); 
    // ... 
} 

당신이 구멍 등 내부 구성 요소와 등, 윤곽의 전체 계층 구조를해야 할 경우, findContours에 대한 호출은 다음과 같이이다 :

vector<vector<Point> > contours; 
Hierarchy hierarchy; 
cv::findContours(img, contours, hierarchy, cv::RETR_TREE, CV_CHAIN_APPROX_SIMPLE); 
// do something with the contours 
// ... 

주 : 파라미터 CV_CHAIN_APPROX_SIMPLE은 윤곽의 직선 세그먼트가 끝점으로 인코딩된다는 것을 나타냅니다. 모든 윤곽 점을 저장하려면 CV_CHAIN_APPROX_NONE을 사용하십시오.

편집 : C에서 당신은 cvFindContours를 호출하고이 같은 윤곽을 액세스 : 현재 윤곽과 계층 구조의 동일한 수준에서 다음 형상에

CvSeq *contours; 
CvMemStorage* storage; 
storage = cvCreateMemStorage(0); 
cvFindContours(img, storage, &contours, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 
CvSeq* c; 
for(c=contours; c != NULL; c=c->h_next) 
{ 
    // do something with the contour 
    CvRect r = cvBoundingRect(c, 0); 
    // ... 
} 

c->h_next 점을, 그리고에 c->v_next 점 현재 윤곽선 내부에있는 첫 번째 윤곽선 (있는 경우). 물론 위와 같이 CV_RETR_EXTERNAL을 사용하면 c->v_next은 항상 NULL이됩니다.

+0

답장을 보내 주셔서 감사합니다. 나는 이것을 C.에서하고 있습니다. 그래서 저는 cvFindContours.Any suggestions for this를 사용해야 할 것입니다. – ATG

+0

C 코드와 설명을 추가했습니다. 희망이 도움이됩니다. – carnieri

+0

윤곽으로 구분 된 ROI를 어떻게 색칠 할 수 있습니까? – Yamaneko

-1

OpenCV에는 이러한 기능이 구현되어 있지 않습니다. 당신도 그것은 바로이 목적으로 개발 된 cvbloblib http://opencv.willowgarage.com/wiki/cvBlobsLib

에서 형태의 작업 (이미지의 뺄셈과 같은 하나의 팽창) 또는 모양이로 검색한다).

+0

연결된 구성 요소를 얻는 방법보다 좋아? – ATG

+0

글쎄, 아마도 cvbloblib 코드 예제를 읽을 때? 나는 이미 당신에게 링크를 준 : – jlengrand

+0

이것은 사실은 정확하지 않다 – Marc

1

당신은 (이 버전 1.0 호출하지만, 2.3에서 비슷한 전화가 있어야한다) cvFindContours를 사용하여 원하는 기능을 cv::findContours라고 OpenCV의 2.3에서

+0

2.3에서도 발견되었습니다 .CvSeq **의 의미를 설명해주십시오. – ATG

+0

각 CvSeq * 구조체는 연결된 구성 요소를 저장합니다. – AruniRC

관련 문제