2017-01-10 2 views
0

원형 모양을 감지하는 코드가 있지만 어떻게 작동하는지 이해할 수 없습니다.OpenCV - 원형 모양 감지

  1. 어떻게 내가 원의 반지름과 중심점을 찾을 수 있습니다 :이 코드에서

    ?

  2. 'cv2.approxPolyDP'가 원을 감지하는 동작은 무엇입니까?

지금 세그먼트 마스크

contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

정렬에 윤곽을 찾을 윤곽 WRT 등고선 RECT X

contours.sort(key = lambda x:cv2.boundingRect(x)[0]) 

for contour in contours: 
     approx = cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True), True) 
     if len(approx) > 8: 
      # Find the bounding rect of contour. 
      contour_bounding_rect = cv2.boundingRect(contour) 
      mid_point = contour_bounding_rect[0] + contour_bounding_rect[2]/2, contour_bounding_rect[1] + contour_bounding_rect[3]/2 
      print mid_point[1]/single_element_height, ", ", 

답변

1

에 대한

참조 설명서 그래서 첫 번째 질문에 대한 답을 알아 낸 : 이미지에서 원의 중심과 반지름을 결정.

처음에는 이미지에있는 모든 윤곽을 찾습니다. 그런 다음 for loop을 사용하여 이미지의 모든 윤곽에 대해 반경cv2.minEnclosingCircle으로 사용했습니다. 나는 그들을 콘솔 화면에 인쇄했다.

contours,hierarchy = cv2.findContours(thresh,2,1) 
print len(contours) 
cnt = contours 

for i in range (len(cnt)): 
    (x,y),radius = cv2.minEnclosingCircle(cnt[i]) 
    center = (int(x),int(y)) 
    radius = int(radius) 
    cv2.circle(img,center,radius,(0,255,0),2) 
    print 'Circle' + str(i) + ': Center =' + str(center) + 'Radius =' + str(radius) 

두 번째 질문에 cv2.approxPolyDP(); 이 함수는 '엡실론 (epsilon)'이라는 매개 변수를 기반으로 이미지의 객체 주위에 대략적인 윤곽을 그립니다. '엡실론'의 값이 높을수록 윤곽선이 대략적으로 근사됩니다. epsilon의 값이 더 낮 으면 윤곽선이 이미지의 객체의 거의 모든 가장자리를 그립니다. 더 나은 이해를 위해 THIS PAGE을 방문하십시오.

희망이 도움이되었습니다! :)

3

이 approxPolyDP 갈 올바른 방법이라고 생각하지 마십시오 이리.

당신 만 원이 이미지를 가지고 있고 중심과 반지름을 찾으려면, minEnclosingCircle 시도()

당신이 다양한 모양을 가지고 있고 원을 찾으려는 이미지가있는 경우, 시도 Hough 변환 (오랜 시간이 걸릴 수 있음) 또는 fitEllipse()는 반환하는 테두리 상자가 정사각형인지 확인합니다. 이 두 기능