opencv - точки отслеживания на изображении - PullRequest
3 голосов
/ 29 мая 2020

Я пытаюсь отслеживать точки на изображении сетчатки, когда сетчатка движется. В настоящее время я использую метод сопоставления шаблонов OpenCV для определения области вокруг точки, а затем нахожу эту область на следующем изображении, чтобы определить, где находится точка.

У меня есть два изображения сетчатки:

enter image description here enter image description here

На первом изображении я произвольно выбираю 3 точки, которые хочу обнаружить:

tracking-1

Затем я использовал следующий код для отслеживания точек на будущих изображениях:

s = 50
folder = 'P2/'
num_images = 2
#desired tracking point: (x, y)
x1, y1 = 157 - s//2, 130 - s//2
x2, y2 = 182 - s//2, 59 - s//2
x3, y3 = 221 - s//2, 125 - s//2
#template is a 100x100 square with (x,y) as top left corner
template = cv2.imread(folder + '1.png',0)
templates = [template[y1:y1+s, x1:x1+s], template[y3:y3+s, x3:x3+s], template[y2:y2+s, x2:x2+s]]
w, h = templates[0].shape[::-1]

# All the 6 methods for comparison in a list
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
            'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']

for i in range(1, num_images+1):
    img = cv2.imread(folder + str(i)+'.png',0)
    meth = 'cv2.TM_CCOEFF_NORMED' #works the best
    method = eval(meth)

    x_pts = []
    y_pts = []
    for tem in templates:
        # Apply template Matching
        res = cv2.matchTemplate(img,tem,method)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

        # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
        if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
            top_left = min_loc
        else:
            top_left = max_loc
        bottom_right = (top_left[0] + w, top_left[1] + h)

        #cv2.rectangle(img,top_left, bottom_right, 255, 2)
        x = top_left[0] + s//2
        y = top_left[1] + s//2
        x_pts += [x]
        y_pts += [y]
        #cv2.rectangle(img,(x, y),(x+1,y+1),(0,255,0),2) #new (x, y) point
        print(top_left)
    plt.plot(x_pts, y_pts,'ro-')
    plt.imshow(img, cmap='gray')
    plt.title(calculate(x_pts,y_pts)), plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)

    plt.show()

Теперь точки на следующем изображении следующие: tracking-2

Хотя этот метод отслеживания является точным, если область вокруг точки уникальна, мне было интересно, есть ли какие-либо более эффективные методы отслеживания точек на изображении? Например, если я отслеживаю размытую область изображения, которая менее различима.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...