2016-09-03 1 views
1

Я преследую небольшую помощь с идеей, с которой я играю. Я хочу, чтобы принять функции, расположенные в изображении с кодом аналогично примеру наOpenCV Python Расширение возможностей обнаружения объектов

See sample image at bottom of page here Последний раздел/Пример является один я говорю о

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

Example of output I'm after

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

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

На данный момент мне удалось сделать все, что нужно, с жестко закодированным набором точек, чтобы представлять углы целевого изображения как повернутые и преобразованные в изображение сцены, так что все работает. Мне просто нужен пример того, как чтобы определить координаты x, y каждого угла цели в этой сцене

Я не хотел публиковать код как немного неуклюжий и его концепцию, которую я выполняю, а не полную это для меня, пожалуйста, исправьте

Любой совет, который очень ценится, Если вы могли бы показать мне, используя прилагаемый пример кода, как это сделать, я был бы очень благодарен, Cheers.

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) 

# FLANN parameters 
FLANN_INDEX_KDTREE = 0 
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) 
search_params = dict(checks=50) # or pass empty dictionary 

flann = cv2.FlannBasedMatcher(index_params,search_params) 

matches = flann.knnMatch(des1,des2,k=2) 

# Need to draw only good matches, so create a mask 
matchesMask = [[0,0] for i in xrange(len(matches))] 

# ratio test as per Lowe's paper 
for i,(m,n) in enumerate(matches): 
    if m.distance < 0.7*n.distance: 
     matchesMask[i]=[1,0] 

draw_params = dict(matchColor = (0,255,0), 
        singlePointColor = (255,0,0), 
        matchesMask = matchesMask, 
        flags = 0) 

img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params) 

plt.imshow(img3,),plt.show() 

ответ

0

Вам необходимо найти предписывающее преобразование между двумя изображениями.

Создайте набор соответствующих координат в соответствии с согласованными функциями.

Например, вы обнаружите, что функция FtI1 в изображении 1 соответствует FtJ1 на изображении 2, поэтому вы знаете, что координата FtI1 (xi, yi) соответствует координате FtJ1 (xj, yj), и у вас есть это для всех соответствующие функции. После того, как у вас есть список соответствующих координат между двумя изображениями, вы можете вычислить предписывающее преобразование с помощью opecv getPerspectiveTransform.

Наконец, используйте преобразование, которое вы нашли на 4 координатах охватывающей формы на первом изображении, чтобы получить координаты охватывающей фигуры во втором изображении. Функция opencv для этого - warpPerspective.

Пример того, как сделать это в opecv в: http://docs.opencv.org/3.1.0/da/d6e/tutorial_py_geometric_transformations.html

+0

Это отличный ответ, спасибо очень много. Я попробую в течение недели сыграть после работы и посмотреть, смогу ли я сделать то, что мне нужно. – SMBee