2017-01-10 3 views
0

У меня есть код, который определяет круговые формы, но я не могу понять, как это работает.OpenCV - Обнаружение круглых форм

Из этого кода:

  1. Как я могу найти радиус и центр окружности?
  2. Каково поведение `cv2.approxPolyDP 'для обнаружения кругов?

Теперь найти контуры сегментированного маски

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

Сортировка контуры WRT контур прямоугольник 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(), где вы проверяете, является ли прямоугольник, который он возвращает, квадратным.

См документации для обеих этих функций

Смежные вопросы