gpt4 book ai didi

Python 和 OpenCV - 关于 findFundamentalMat 行为的问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:15:32 38 4
gpt4 key购买 nike

如果标题有歧义,请见谅。很难用简短易懂的方式表达我的问题。

所以,我正在进行 3D 重建项目。管道与标准管道大致相同,其中

  1. 不扭曲图像
  2. 用关键点检测器检测点
  3. 跨帧跟踪点(光流)
  4. 计算基本矩阵

等等。唯一不同的部分是在第 2 步,我使用线段检测器并跨帧跟踪它。

因此,如果我使用关键点检测器,给出两帧图像,我将得到两组关键点(每组对应于每一帧)。但就我的情况而言,我有四组关键点(每两组对应每一帧,因为一条线有起点和终点)。

为了计算基本矩阵,我需要连接每一帧的两组点。

一种方法是通过垂直连接它:np.vstack([start_point, end_point])

另一种方法是:np.hstack([start_point, end_point]).reshape(-1, 2)。意思是,它“交替”连接,即

[[start_point[0],
end_point[0],
start_point[1],
end_point[1],
...]]

两者都将以相同的形状结束。但公平地说,它们产生了截然不同的结果。根据我的观察,vstack 产生了更“类 3D”的结果,而 hstack 产生了更“类平面”的重建结果。

问题是这是为什么?哪一个应该更好?

下面是给出这个问题的 View 的示例代码:

import numpy as np
import cv2

np.random.seed(0)

def prepare_points(pts_frame1, pts_frame2):
# Prepare the four sets of points
(p1_f1, p2_f1) = pts_frame1
(p1_f2, p2_f2) = pts_frame2

v_stacked_f1f2 = (np.vstack([p1_f1, p2_f1]), np.vstack([p1_f2, p2_f2]))
h_stacked_f1f2 = (np.hstack([p1_f1, p2_f1]).reshape(-1, 2),
np.hstack([p1_f2, p2_f2]).reshape(-1, 2))

return (v_stacked_f1f2, h_stacked_f1f2)

pts_frame1 = np.random.random_sample((60, 2)).astype("float32")
pts_frame2 = np.random.random_sample((60, 2)).astype("float32")

# Emulate the two sets of points for each frame where
# the first set is the start point, while
# the second set is the end point of a line
pts_frame1 = (pts_frame1[::2], pts_frame1[1::2])
pts_frame2 = (pts_frame2[::2], pts_frame2[1::2])

(v_stacked_f1f2, h_stacked_f1f2) = prepare_points(pts_frame1, pts_frame2)

F_vstacked = cv2.findFundamentalMat(v_stacked_f1f2[0], v_stacked_f1f2[1],
cv2.FM_RANSAC, 3, 0.99)[0]
F_hstacked = cv2.findFundamentalMat(h_stacked_f1f2[0], h_stacked_f1f2[1],
cv2.FM_RANSAC, 3, 0.99)[0]

print("F_vstacked:\n", F_vstacked, "\n")
print("F_hstacked:\n", F_hstacked, "\n")

# F_vstacked:
# [[ 3.31788127 -2.24336615 -0.77866782]
# [ 0.83418839 -1.4066019 -0.92088302]
# [-2.75413748 2.27311637 1. ]]

# F_hstacked:
# [[ 7.70558741 25.29966782 -16.20835082]
# [-12.95357284 -0.54474384 14.95490469]
# [ 1.79050172 -10.40077071 1. ]]

最佳答案

findFundamentalMat 函数处理点格式如下:2*N,其中 N 是点数。所以我认为“F_hstacked”是正确的。还有一点我不清楚,为什么你只想用线的端点来估计运动?那么特征点是否准确?因为你无法准确地弄清楚每条线的终点在哪里(像素)。

关于Python 和 OpenCV - 关于 findFundamentalMat 行为的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40620862/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com