【发布时间】:2018-09-12 17:30:35
【问题描述】:
我正在尝试为捆绑调整准备重叠的航拍图像,以创建地形的 3D 重建。到目前为止,我有一个脚本可以计算哪些图像重叠并构建这些图像对的列表。我的下一阶段是检测和计算每个图像的 SIFT 特征,然后将特征点与数据集中重叠的任何图像进行匹配。为此,我正在使用 OpenCV 中提供的 FLANN Matcher。
我的问题是,捆绑调整输入需要为每个特征点提供唯一的点 ID。据我所知,FLANN 匹配器一次只能匹配两个图像的特征点。那么,如果我在 5 个摄像头中有一个相同的点可见,我怎样才能给这个点一个在 5 个摄像头中一致的 ID?如果我现在在匹配过程中保存该点时简单地给它一个 ID,那么同一点将具有不同的 ID,具体取决于用于计算它的摄像机集。
束调整输入的格式为:
camera_id (int), point_id(int), point_x(float), point_y(float)
我使用它是因为我所遵循的捆绑调整代码教程使用了BAL 数据集(即ceres solver 和scipy)。
我最初的想法是计算和描述所有图像中的所有 SIFT 点并添加到 1 个列表中。从这里我可以删除任何重复的关键点描述符。一旦我的数据集中有一个唯一 SIFT 点的列表,我就可以按顺序为每个点添加一个 ID。然后每次我匹配一个点时,我都可以在这个列表中查找点描述符并根据该列表分配点 ID。虽然我觉得这可行,但它似乎很慢,并且没有使用我用于匹配的 K-TREE 匹配方法。
所以最后,我的问题是......有没有办法在 OpenCV python 中使用 FLANN 匹配器来实现多个视图 (>2) 的特征匹配?或者……摄影测量/SLAM 社区有解决这个问题的通用方法吗?
到目前为止我的代码:
matches_list = []
sift = cv2.xfeatures2d.SIFT_create()
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params,search_params)
for i in overlap_list:
img1 = cv2.imread(i[0], 0)
img2 = cv2.imread(i[1], 0)
img1 = cv2.resize(img1, (img1.shape[1]/4, img1.shape[0]/4), interpolation=cv2.INTER_CUBIC)
img2 = cv2.resize(img2, (img2.shape[1]/4, img2.shape[0]/4), interpolation=cv2.INTER_CUBIC)
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
matches = flann.knnMatch(des1,des2,k=2)
for j,(m,n) in enumerate(matches):
if m.distance < 0.7*n.distance:
pt1 = kp1[m.queryIdx].pt
pt2 = kp2[m.trainIdx].pt
matches_list.append([i[0], i[1], pt1, pt2])
这将返回一个具有以下结构的列表length = number of feature matches:
matches_list[i] = [camera_1.jpg, camera_2.jpg, (cam1_x, cam1_y), (cam2_x, cam2_y)]
【问题讨论】:
-
查看 Richard Szeliski 的 "Image Alignment and Stitching: A Tutorial"。真正伟大的资源概述了所有的拼接。捆绑调整从第 48 页(PDF 第 50 页)开始。您没有说明您使用的捆绑调整算法需要这些输入,但真正的捆绑调整会利用所有功能并且不会重复。您需要所有特征点,因为您试图将每个特征点映射到其他图像中的位置的错误最小化。
-
感谢您的链接。这让我想起了我实际上有他的计算机视觉教科书!我正在研究使用 ceres 求解器捆绑调整以及 scipy 实现。他们在他们的教程中都使用了 BAL 数据集 (grail.cs.washington.edu/projects/bal),它为多个视图中的每个点使用一致的点 ID。你能推荐一个BA吗?
-
是的,他的书很扎实——我喜欢这个教程,因为它不会太深,只涵盖了要点,所以它是一个很好的复习。我没有使用任何特定的 BA sw 包,所以我不确定它是如何工作的。我不确定这是否是 需要 做的,但是跨图像标记每个特征的方法是使用连接的组件。如果
img1中的特征xi1, yi1与img2中的xj2, yj2匹配,并且xj2, yj2与img3中的xk3, yk3匹配,则计算所有成对匹配并将其全部放入一个图中,每个连接组件是您可以识别的匹配特征。