OmgZomg 2 Жалоба Опубликовано December 6, 2020 У меня в цикле строится гомография между парами снимков. Как это оформить в граф? Желательно в матрицу смежности for b in s.left_list[1:]: H = s.matcher_obj.match(a, b, 'left') Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано December 6, 2020 По горизонтали точки левого изображения, по вертикали правого, если соединяются то в пересечении 1 если нет, 0. Получите матрицу смежности. Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
OmgZomg 2 Жалоба Опубликовано December 7, 2020 12 hours ago, Smorodov said: По горизонтали точки левого изображения, по вертикали правого, если соединяются то в пересечении 1 если нет, 0. Получите матрицу смежности. Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес. Благодарю! Можно пример кода? Желательно на Python Особенно интересует этот момент "Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес. ". Не могу пока никак сообразить как это закодить Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано December 7, 2020 Ну код крафтить мне лень ) Чтобы добыть ключевые точки, можно заюзать что то такое: import numpy as np import cv2 from matplotlib import pyplot as plt img1 = cv2.imread('box.png',0) # queryImage img2 = cv2.imread('box_in_scene.png',0) # trainImage # Initiate SIFT detector sift = cv2.SIFT() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) Есть 2 набора точек, у которых есть дескрипторы (многомерные точки), так вот, делаем двойной вложенный цикл. И заполняем матрицу NxM, где N - количество точек первого изображения, а M - второго. Элемент матрицы D[i,j] будет равен расстоянию между i-той и j-той точками (точнее их дескрипторами). 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
OmgZomg 2 Жалоба Опубликовано December 8, 2020 Вот так сделал def match(self, i1, i2, direction=None): imageSet1 = self.getSURFFeatures(i1) imageSet2 = self.getSURFFeatures(i2) print("Direction : ", direction) matches = self.flann.knnMatch( imageSet2['des'], imageSet1['des'], k=2 ) good = [] for i , (m, n) in enumerate(matches): if m.distance < 0.7*n.distance: good.append((m.trainIdx, m.queryIdx)) if len(good) > 4: pointsCurrent = imageSet2['kp'] pointsPrevious = imageSet1['kp'] matchedPointsCurrent = np.float32( [pointsCurrent[i].pt for (__, i) in good] ) matchedPointsPrev = np.float32( [pointsPrevious[i].pt for (i, __) in good] ) H, s = cv2.findHomography(matchedPointsCurrent, matchedPointsPrev, cv2.RANSAC, 4) return H,sum(s) / len(s) return None def getSURFFeatures(self, im): gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) kp, des = self.surf.detectAndCompute(gray, None) return {'kp':kp, 'des':des} N = len(img_list) adjacency_matrix = np.zeros((N, N)) for i in range(N): for j in range(i + 1, N): out = s.matcher_obj.match(lst[i], lst[j], 'left') if out is not None: H, s = out if s >= 0.5: adjacency_matrix[i, j] = 1 adjacency_matrix[j, i] = 1 print('AM',adjacency_matrix) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано December 8, 2020 Только расстояние между дескрипторами обратно пропорционально схожести точек. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
OmgZomg 2 Жалоба Опубликовано December 8, 2020 1 hour ago, Smorodov said: Только расстояние между дескрипторами обратно пропорционально схожести точек. Что Вы имеете ввиду? Где мне исправить? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано December 8, 2020 Да не, все вроде верно, просто не внимательно прочитал. Я думал вы в сторону hungarian-algorithm клоните ) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах