Показ дописів із міткою OpenCV. Показати всі дописи
Показ дописів із міткою OpenCV. Показати всі дописи

середа, 14 квітня 2021 р.

Перетворення Хафа для кола

Mathedemo
Фазовий простір Хафа для кола визначається трьома параметрами -- центром кола $(x,y)$ і радіусом кола $R.$ Відповідні накопичення відбуваються у 3D-масиві.

Функція OpenCV для виявлення кіл -- cv2.HoughCircles:

circles=cv2.HoughCircles (image, method, dp, minDist, param1 = 100,  param2 = 100, \
  minRadius = minRadius, maxRadius = maxRadius)

де

  • circles: вектор знайдених кіл у форматі $(x, y, radius)$
  • image: вхідне напівтонове зображення.
  • method: cv2.HOUGH_GRADIENT
  • dp: відношення роздільної здатності акумулятора до роздільної здатності зображення. Наприклад, якщо $dp = 1$, акумулятор має таку ж роздільну здатність, що і вхідне зображення. Якщо $dp = 2$, акумулятор має вдвічі меншу ширину та висоту.
  • minDist: мінімальна відстань між центрами виявлених кіл. Якщо параметр занадто малий, на додаток до істинного може бути помилково виявлено кілька сусідських кіл. Якщо він занадто великий, деякі кола можуть бути пропущені.
  • param1: це найвищий поріг який використовувався в детекторі Кенні ( якщо використовувався).
  • param2: поріг накопичувача для центрів кіл на етапі виявлення. Чим він менший, тим більше помилкових кіл може бути виявлено.
  • minRadius: мінімальний радіус кола.
  • maxRadius: максимальний радіус кола.
img=cv2.imread('file.jpg')
copy = img.copy()
img_gray=cv2.cvtColor(copy,cv2.COLOR_BGR2GRAY)
#img_blur = cv2.medianBlur(img_gray, 5) - при потребі
circles = cv2.HoughCircles(img_gray, cv2.HOUGH_GRADIENT, 1.4, 40, param1=150, param2=50, minRadius=60, maxRadius=100)
if circles is not None:
    circles = np.uint16(np.around(circles))
    for i in circles[0, :]:
        cv2.circle(copy, (i[0], i[1]), i[2], (0, 255, 0), 3)
#кількість  монет
print(len(circles[0]))

неділя, 11 квітня 2021 р.

Знаходження центрів мас контурів

 
def centers_contours(img):
    if len(img.shape)==3:
        img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        copy=img.copy()
    else:
        img_gray=img
        copy=cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)
    threshold1=300
    threshold12=500
    edges=cv2.Canny(img_gray,threshold1,threshold12,apertureSize=5)
    contours, hierarchy = cv2.findContours(edges,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    for cont in contours:
        M = cv2.moments(cont)
        if M['m00']>20:# обмеження на площу контура
            cx = int(M['m10']/M['m00'])
            cy = int(M['m01']/M['m00'])
            cv2.circle(copy, (cx,cy), 3, (0,0,255), 3)
    return copy   
Використовуються геометричні моменти,для ігнорування випадкових малих контурів площа контурів обмежується знизу.