Python OpenCV: вывести статистику из кругового обнаружения - PullRequest
2 голосов
/ 27 июня 2019

Одноклассник и я работаем над счетчиком монет с помощью обработки изображений. Мы использовали два метода, чтобы распознать монеты как круги. С одной стороны, связанные компоненты со статистикой, а с другой - преобразование Хафа. Преимуществом CC w / Stats является прямой вывод всех важных параметров (например, площади пикселей). Тем не менее, CC имеет более слабые характеристики при касании монет на изображении (центр монеты распознан неправильно). Hough Transformation не имеет этой проблемы и легко распознает каждый круг правильно. Однако мы не знаем, как использовать здесь данные обнаруженных объектов. Так есть ли способ вывести данные с помощью другой функции или есть способ генерировать гибридный код из CC с помощью Stats and Hough Transformation?

import cv2
import numpy as np
import matplotlib.pyplot as plt

image='17.png'
img=cv2.imread(image,1)
img_orig=img.copy()
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

img=cv2.GaussianBlur(img,(21,21),cv2.BORDER_DEFAULT)


all_circs=cv2.HoughCircles(img, cv2.HOUGH_GRADIENT,1,500,param1=110,param2=35,minRadius=200,maxRadius=600)
all_circs_rounded=np.uint32(np.around(all_circs))


count = 1
for i in all_circs_rounded[0, :]:
    cv2.circle(img_orig,(i[0],i[1],),i[2],(255,0,0),3)
    cv2.circle(img_orig,(i[0],i[1],),2,(255,0,0),3)
    cv2.putText(img_orig,"Coin"+str(count),(i[0]-70,i[1]+30),cv2.FONT_HERSHEY_SIMPLEX,1.1,(255,0,0),2)
    count+=1

print (all_circs_rounded)
print (all_circs_rounded.shape)
print ('I have found ' + str(all_circs_rounded.shape[1]) + ' coins')

plt.rcParams["figure.figsize"]=(16,9)
plt.imshow(img_orig)

1 Ответ

0 голосов
/ 27 июня 2019

Существует несколько возможных решений этой проблемы

  1. Вы можете использовать сегментацию изображения с водоразделом .Этот метод обладает тем преимуществом, что позволяет находить касающиеся монеты на изображении, поскольку вы можете легко сегментировать монеты друг от друга.Кроме того, водораздел позволяет получить центр монеты, где можно провести дополнительную обработку.

  2. Продолжайте использовать Hough Circle Transform .Функция возвращает различные параметры, такие как радиус, который вы можете использовать, чтобы найти площадь круга.Вот быстрый пример получения радиуса, который вы можете использовать для поиска области, используя классическую формулу .Этот метод также позволяет легко получить центр круга.

# detect circles in the image
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 100)

# ensure at least some circles were found
if circles is not None:
    # convert the (x, y) coordinates and radius of the circles to integers
    circles = np.round(circles[0, :]).astype("int")

    # loop over the (x, y) coordinates and radius of the circles
    for (x, y, r) in circles:
        # draw the circle in the output image, then draw a rectangle
        # corresponding to the center of the circle
        cv2.circle(output, (x, y), r, (0, 255, 0), 4)
        cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)

        # calculate area here
        ...

Поверните полностью и используйте обнаружение контура с фильтрацией.Возможные шаги:

...