Алгоритм компьютерного зрения, определение круга - PullRequest
0 голосов
/ 17 июня 2020

сейчас пытаюсь изучить компьютерное зрение, но не знаю, как запустить алгоритм, пригодятся любые указатели.

Image below

Ответы [ 3 ]

1 голос
/ 17 июня 2020

Предположим, у вас есть матрица из белых пикселей с небелым кружком внутри. Чтобы обнаружить круг, я бы сделал это следующим образом:

for(int x = 0; x < matrix.width; x++){
    for(int y = 0; y < matrix.height; y++){
        if(matrix[x][y] != white) {
            GetCircleCenter(x, y);
            return;
        }            
    }
}

Теперь, когда вы знаете, что пиксель (x, y) является частью круга, давайте создадим метод, чтобы найти его центр.

Предположим, найденный вами пиксель отмечен желтым цветом. Теперь наша цель - найти два пикселя, отмеченные синим цветом:

enter image description here

Чтобы найти это, давайте сгенерируем два небольших значения v1 и v2, скажем v1 = v2 = 1.

Теперь мы проверим это:

Color c = matrix[x][y];
int v1 = 1, v2 = 1;
while(matrix[x - v1][y] == c) v1 *= 2;
while(matrix[x + v2][y] == c) v2 *= 2;

Когда этот метод завершится, вы знаете, что левый синий пиксель будет находиться между (x - v1) и (x - v1 / 2), а правый синий пиксель будет между (x + v2 / 2) и (x + v2). Вы можете выполнить двоичный поиск, чтобы быстро найти точные пиксели.

Когда вы найдете оба пикселя, вы узнаете горизонтальный центр круга. Теперь проделайте то же самое с вертикальным центром, и вы получите центр вашего круга.

0 голосов
/ 19 июня 2020

Круг - это фигура максимальной площади с заданным периметром. Это можно использовать для поиска. Для поиска цветных объектов вы можете использовать функцию InRange (). См. Пример:

import cv2
import numpy as np
img=cv2.imread('calRH.jpg')
blank=np.zeros_like(img)[:,:,0]
#convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#color definition
color_lower = np.array([0,50,33])
color_upper = np.array([180,255,255])
# select only color objects
mask = cv2.inRange(hsv, color_lower, color_upper)
contours,hierarchy = cv2.findContours(mask, 1, 2)

for cnt in contours:
    perimeter = cv2.arcLength(cnt,True)
    area = cv2.contourArea(cnt)
    k=4*np.pi*area/(perimeter*perimeter)
    if k>0.86: #test area/perimeter ratio
        print('is circle ',k)
        tmp=blank.copy()
        cv2.drawContours(tmp, [cnt], 0, (255), -1)
        cv2.drawContours(img, [cnt], 0, (0,255,0), 1)
        m=cv2.mean(img, mask=tmp) # mean color circle
        print('mean color', m[0:3])
cv2.imwrite('color_circles.png', img) #save image

enter image description here

0 голосов
/ 17 июня 2020

Преобразование Хафа часто применяется для обнаружения линий на краевых изображениях. Но существует его вариант, который заставляет его работать и для обнаружения круга. Взгляните на страницу Википедии , которая содержит даже псевдокод.

Общая идея состоит в том, что все краевые точки ваших кругов голосуют за все возможные параметры круга (соответствующие кругам), которые могли привести к появлению этих точек на изображении. После этого параметры круга, получившие наибольшее количество голосов (обнаруженные либо путем обнаружения всех локальных максимумов, либо путем итеративного определения глобальных максимумов в пространстве Хафа, пока максимальное количество голосов не упадет ниже порогового значения), выдают параметры, определяющие предполагаемые круги на изображении. .

Когда у вас есть все характеристики круга, вы можете просто посмотреть цвет в центре каждого обнаруженного круга.

...