Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 匹配器,用于从点列表(不同长度)而不是图像中查找单影_Python_Opencv_Matcher_Homography - Fatal编程技术网

Python 匹配器,用于从点列表(不同长度)而不是图像中查找单影

Python 匹配器,用于从点列表(不同长度)而不是图像中查找单影,python,opencv,matcher,homography,Python,Opencv,Matcher,Homography,Tl;博士 我想使用bf.matcher,而不使用sift、surf或任何这些方法。我只想匹配两组不同长度的点。 知道怎么做吗 你好, 我有一张照片,其中我检测到一些不同物体的近似中心(使用自定义方法)。我没有检测到所有的异常值,并且存在一些异常值。 我知道这些物体在现实世界中的位置 现在,我想将这些近似位置与真实世界的位置进行匹配。最终目标是在我的图像(像素)中设置真实世界的坐标系(米)。 我想我只是想在我的两个集合之间找到一个单应,对吗 # Let's say for example th

Tl;博士
我想使用
bf.matcher
,而不使用sift、surf或任何这些方法。我只想匹配两组不同长度的点。
知道怎么做吗


你好,

我有一张照片,其中我检测到一些不同物体的近似中心(使用自定义方法)。我没有检测到所有的异常值,并且存在一些异常值。
我知道这些物体在现实世界中的位置

现在,我想将这些近似位置与真实世界的位置进行匹配。最终目标是在我的图像(像素)中设置真实世界的坐标系(米)。
我想我只是想在我的两个集合之间找到一个单应,对吗

# Let's say for example that my set of image coordinates is:
Xim = [735, 760, 610, 462]
Yim = [-685, -631, -485, -319]

# And that they have to be matched with:
Xreal = [0.75, 0.875, 0.125, -0.625, -0.125, 0.25]
Yreal = [1.625, 1.875, 2.625, 3.5, 4.25, 4.75]
如果我想使用opencv函数
cv2.findHomography
,我需要在两个集合中拥有相同数量的点。所以我要测试每个可能的点组合(
6这里选择4=15
),计算它们的单应矩阵,然后选择失真最小的一个

import itertools
import numpy as np
import cv2

# I need 4 points in both sets, so I'm trying all combinations:
Xreal_test=[]; Yreal_test = []
combin = itertools.combinations(np.arange(len(Xreal)),len(Xim))
for k,c in enumerate(combin):
    Xreal_test = Xreal_test + [[Xreal[list(c)[i]] for i in range(len(list(c)))]]
    Yreal_test = Yreal_test + [[Yreal[list(c)[i]] for i in range(len(list(c)))]]


# Formatting the sets that way cv2.findHomography wants them, and calculate homography
H=[]
pts_xim = np.array([[Xim[x],Yim[x]] for x in range(len(Xim))])
for i in range(len(Xreal_test)):
    pts_xreal = np.array([[Xreal_test[i][x],Yreal_test[i][x]] for x in range(len(Xim))])
    # Calculate homography
    h, _ = cv2.findHomography(pts_xreal, pts_xim, cv2.RANSAC)
    H = H + [h]
就这样
但当然,我还有更多的观点,尝试所有组合都会非常消耗资源(如果不是愚蠢的话)

因此,我不想为所有可能的组合计算单应性,而是想使用稍微少一点的“暴力”,例如使用
bf.Matcher()

这就是我现在的位置。我知道如何使用图像,但不知道如何使用一组点(这应该更容易)。通过以下方法可以从图像中查找同音字:

img1 = cv2.imread('box.png',0)         
img2 = cv2.imread('box_in_scene.png',0)

surf = cv2.xfeatures2d.SURF_create()
kp1, des1 = surf.detectAndCompute(img1,None)
kp2, des2 = surf.detectAndCompute(img2,None)

bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)

good = []
for m,n in matches:
    if m.distance < 0.7*n.distance:
        good.append(m)
src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)

h, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
img1=cv2.imread('box.png',0)
img2=cv2.imread(_scene.png中的框,0)
surf=cv2.xfeature2d.surf_create()
kp1,des1=表面检测和计算(img1,无)
kp2,des2=表面检测和计算(img2,无)
bf=cv2.BFMatcher()
匹配=bf.knnMatch(des1,des2,k=2)
好的=[]
对于匹配中的m,n:
如果m.距离<0.7*n.距离:
好。追加(m)
src_pts=np.float32([kp1[m.queryIdx].pt代表m处于良好状态])。重塑(-1,1,2)
dst_pts=np.float32([kp2[m.trainIdx].pt代表m处于良好状态])。重塑(-1,1,2)
h、 掩模=cv2.findHomography(src_pts,dst_pts,cv2.RANSAC,5.0)
kp,des=surf.detectAndCompute(img,None)
提供两个输出,
关键点和
描述符。我不需要使用surf(或sift,或orb)来解决我的问题,但是我需要向bf.matcher提供描述符。
知道如何使用一组预定义的点来完成吗?


提前谢谢

所以你想使用“更少的暴力”并使用暴力匹配器我认为它使用了一个描述符,这让它在某种程度上减少了暴力?我必须说我不太清楚它是如何工作的。我只知道,蛮力匹配器似乎仍然工作得很好,还有50多分要匹配。另一方面,如果我尝试所有的组合,比如说,我有20个检测点要在40个真实世界的点中匹配,那么它将测试137 846 528 820个组合。在我看来这是天文学,不是吗?或者,我可以使用flann匹配器,但我有相同的问题:它需要输入描述符,而我没有。只需使用图像和地面上相应控制点的列表,进行简单的透视变换,扭曲一幅图像以匹配地面。问题是,如果我想执行
cv2.getPerspectiveTransform(pts_xim,pts_xreal)
,我仍然需要在两幅图像中具有相同数量的点。所以我需要对所有图像点和真实点的组合进行透视变换,这是非常巨大的。。。另外,我相信在我的例子中,使用
findHomography
更好,因为与
getPerspectiveTransform
不同,我不需要按正确的顺序获取点。