OmgZomg 2 Report post Posted December 6, 2020 У меня в цикле строится гомография между парами снимков. Как это оформить в граф? Желательно в матрицу смежности for b in s.left_list[1:]: H = s.matcher_obj.match(a, b, 'left') Share this post Link to post Share on other sites
Smorodov 572 Report post Posted December 6, 2020 По горизонтали точки левого изображения, по вертикали правого, если соединяются то в пересечении 1 если нет, 0. Получите матрицу смежности. Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес. 1 Share this post Link to post Share on other sites
OmgZomg 2 Report post Posted December 7, 2020 12 hours ago, Smorodov said: По горизонтали точки левого изображения, по вертикали правого, если соединяются то в пересечении 1 если нет, 0. Получите матрицу смежности. Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес. Благодарю! Можно пример кода? Желательно на Python Особенно интересует этот момент "Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес. ". Не могу пока никак сообразить как это закодить Share this post Link to post Share on other sites
Smorodov 572 Report post Posted 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 Share this post Link to post Share on other sites
OmgZomg 2 Report post Posted 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) Share this post Link to post Share on other sites
Smorodov 572 Report post Posted December 8, 2020 Только расстояние между дескрипторами обратно пропорционально схожести точек. 1 Share this post Link to post Share on other sites
OmgZomg 2 Report post Posted December 8, 2020 1 hour ago, Smorodov said: Только расстояние между дескрипторами обратно пропорционально схожести точек. Что Вы имеете ввиду? Где мне исправить? Share this post Link to post Share on other sites
Smorodov 572 Report post Posted December 8, 2020 Да не, все вроде верно, просто не внимательно прочитал. Я думал вы в сторону hungarian-algorithm клоните ) Share this post Link to post Share on other sites