텍스트가있는 이미지가 있고 연결된 모든 구성 요소의 경계 픽셀을 찾고 싶습니다. opencv 2.3에서 사용해야하는 방법은 무엇입니까? 이 함수는 matlab의 경계와 비슷할 수 있습니다.opencv에서 이미지의 각 연결된 구성 요소의 경계 픽셀을 찾는 방법
감사합니다.
텍스트가있는 이미지가 있고 연결된 모든 구성 요소의 경계 픽셀을 찾고 싶습니다. opencv 2.3에서 사용해야하는 방법은 무엇입니까? 이 함수는 matlab의 경계와 비슷할 수 있습니다.opencv에서 이미지의 각 연결된 구성 요소의 경계 픽셀을 찾는 방법
감사합니다.
. 각 윤곽 (연결된 구성 요소의 경계)은 점의 벡터로 저장됩니다. 다음은 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
이됩니다.
OpenCV에는 이러한 기능이 구현되어 있지 않습니다. 당신도 그것은 바로이 목적으로 개발 된 cvbloblib http://opencv.willowgarage.com/wiki/cvBlobsLib
에서 형태의 작업 (이미지의 뺄셈과 같은 하나의 팽창) 또는 모양이로 검색한다).
당신은 (이 버전 1.0 호출하지만, 2.3에서 비슷한 전화가 있어야한다) cvFindContours를 사용하여 원하는 기능을 cv::findContours라고 OpenCV의 2.3에서
답장을 보내 주셔서 감사합니다. 나는 이것을 C.에서하고 있습니다. 그래서 저는 cvFindContours.Any suggestions for this를 사용해야 할 것입니다. – ATG
C 코드와 설명을 추가했습니다. 희망이 도움이됩니다. – carnieri
윤곽으로 구분 된 ROI를 어떻게 색칠 할 수 있습니까? – Yamaneko