Перейти к содержимому
Compvision.ru
OmgZomg

Построить граф в виде матрицы

Recommended Posts

У меня в цикле строится гомография между парами снимков.

Как это оформить в граф? Желательно в матрицу смежности

for b in s.left_list[1:]:
        H = s.matcher_obj.match(a, b, 'left')

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По горизонтали точки левого изображения, по вертикали правого, если соединяются то в пересечении 1 если нет, 0. 

Получите матрицу смежности. Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес. 

  • Thanks 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 hours ago, Smorodov said:

По горизонтали точки левого изображения, по вертикали правого, если соединяются то в пересечении 1 если нет, 0. 

Получите матрицу смежности. Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес. 

Благодарю! Можно пример кода? Желательно на Python   Особенно интересует этот момент "Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес. ". Не могу пока никак сообразить как это закодить:huh:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну код крафтить мне лень )

Чтобы добыть ключевые точки, можно заюзать что то такое:

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-той точками (точнее их дескрипторами).

 

  • Thanks 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот так сделал

 

	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)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Только расстояние между дескрипторами обратно пропорционально схожести точек. 

  • Thanks 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 hour ago, Smorodov said:

Только расстояние между дескрипторами обратно пропорционально схожести точек. 

Что Вы имеете ввиду? Где мне исправить?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да не, все вроде верно, просто не внимательно  прочитал. 

Я думал вы в сторону hungarian-algorithm клоните ) 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×