2016-08-01 7 views
2

시계 방향 또는 반 시계 방향으로 윤곽선 좌표를 저장할 수있는 여러 실루엣의 가장 바깥 쪽 윤곽을 검색해야합니다. 내가 읽은 바에 따르면 OpenCV의 Canny + findContours를 사용하여 이러한 종류의 결과를 보관할 수 있습니다. 불행히도, 내가 정교해야 할 실루엣의 대부분은 모서리 나 구멍이 톱니 모양이 아니므로 "표준 절차"가 제대로 작동하지 않습니다. 예를 들어, 내 이미지는 매우 간단 경우 내가 원하는대로 구멍없이, 결과는 정확하게 그것 (단지 바깥 쪽 윤곽 좌표를 주문하고) : 구멍 사진의 경우 Cup example실루엣에서 가장 바깥 쪽 윤곽 추출

, 나는 세그먼트 바깥 쪽 윤곽을 얻을 (다른 색상, 첨부 된 그림 참조) 최종 이미지에는 내부 구멍이 계속 표시됩니다. 가장자리가 고르지 않아 최악의 결과를 얻었습니다. 구멍이 표시되고 윤곽선이 매우 세분화됩니다 (Cat). Holes and jagged edges

코드 :

//add a small padding. Otherwise, in case of images where the border is partially cut out it won't be considered as a "closed" contour 
int topbottom = (int) (0.05*image.rows); 
int rightleft = (int) (0.05*image.cols); 
copyMakeBorder(image, image, topbottom, topbottom, rightleft, rightleft, BORDER_CONSTANT); 

//consider only alpha channel to create a silhouette 
Mat silhouette; 
vector<Mat> ch; 
split(image, ch); 

Canny(ch[3], silhouette, 100, 200); 

vector<vector<Point>> contours; 
vector<Vec4i> hierarchy; 

//find only the external contour 
findContours(silhouette, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

RNG rng(12345); 
Mat drawing = Mat::zeros(silhouette.size(), CV_8UC3); 
for(int i = 0; i < contours.size(); i++) 
{ 
    Scalar colour = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
    drawContours(drawing, contours, i, colour, 1, 8, hierarchy, 0, Point()); 
} 

구멍의 윤곽을 세분화를 방지하고 제거하는 방법이 있나요?

+3

컨투어 결과의 추가 이미지없이 컨투어를 가져오고 자하는 이미지 만 올리실 수 있습니까? –

+0

예! 다음은 그 중 일부입니다 [첫 샘플 그림 (침대) (http://labelmaterial.s3.amazonaws.com/shapes/2KGnQ5RjIoXZXmoXr723dXz.png) [두 번째 샘플 그림 (고양이) (HTTP : //labelmaterial.s3 .amazonaws.com/shapes/2NXvn0zPaDGXLIoQJ9LuyVT.png) – Izzy88

+0

구멍과 들쭉날쭉 한 가장자리에 두 번째 이미지가 있습니다. 이제 모든 윤곽선에서 가장 큰 윤곽선을 찾고 그려 봅니다. 단지 하나의 바깥 쪽 윤곽 만 얻을 수 있습니다. 필요. –

답변

0

OpenCV에는 입력 윤곽 영역을 계산할 수있는 cv2.contourArea()이라는 기능이 있습니다. 윤곽이 둘 이상인 경우이 기능을 사용하여 모든 윤곽의 영역을 찾고 가장 큰 윤곽 (큰 윤곽의 윤곽에 더 큰 영역이 없으므로 가장 큰 윤곽을 포함하는 윤곽)을 제외한 모든 윤곽을 삭제합니다. 그 후에 가장 큰 외부 윤곽 만 남게됩니다.

관련 문제