Я пытаюсь отслеживать точки на изображении сетчатки, когда сетчатка движется. В настоящее время я использую метод сопоставления шаблонов OpenCV для определения области вокруг точки, а затем нахожу эту область на следующем изображении, чтобы определить, где находится точка.
У меня есть два изображения сетчатки:
На первом изображении я произвольно выбираю 3 точки, которые хочу обнаружить:
Затем я использовал следующий код для отслеживания точек на будущих изображениях:
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()
Теперь точки на следующем изображении следующие:
Хотя этот метод отслеживания является точным, если область вокруг точки уникальна, мне было интересно, есть ли какие-либо более эффективные методы отслеживания точек на изображении? Например, если я отслеживаю размытую область изображения, которая менее различима.