cv2.findFundamentalMat(mkpts0, mkpts1, cv2.USAC_MAGSAC, 0.15, 0.9999, 20000)代码中的mkpts0, mkpts1是匹配点坐标吗 删除 重试 复制
时间: 2023-09-30 14:10:40 浏览: 347
使用opencv中匹配点对的坐标提取方式
是的,`mkpts0`和`mkpts1`是匹配点的坐标,用于计算基础矩阵。具体来说,`mkpts0`和`mkpts1`是两个形状为(N, 2)的numpy数组,分别表示两张图像中匹配的关键点在图像中的坐标位置。一般来说,这些关键点是通过特征检测和描述符匹配算法得到的。
关于参数的解释:
- `cv2.USAC_MAGSAC`是使用的求解器的类型,这里是使用的MAGSAC求解器。
- `0.15`是RANSAC算法的阈值,表示误差小于这个值的点被认为是内点。
- `0.9999`是RANSAC算法的置信度,表示元素被正确估计的概率。
- `20000`是RANSAC算法的最大迭代次数,表示算法最多执行的次数。
注意,这里使用的是MAGSAC求解器,而不是OpenCV默认的RANSAC求解器。MAGSAC是一种更高效和鲁棒的RANSAC求解器,能够在更短的时间内得到更好的结果。如果你使用OpenCV默认的RANSAC求解器,可以将`cv2.USAC_MAGSAC`改为`cv2.FM_RANSAC`,并调整相应的参数。
以下是一个简单的Python示例,演示如何使用`cv2.findFundamentalMat()`函数计算基础矩阵:
```python
import cv2
import numpy as np
# 读取图像
img1 = cv2.imread('img1.jpg', 0)
img2 = cv2.imread('img2.jpg', 0)
# 初始化SIFT探测器
sift = cv2.SIFT_create()
# 检测关键点和描述符
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# 匹配关键点
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
# 筛选出好的匹配
good = []
for m, n in matches:
if m.distance < 0.75 * 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)
# 计算基础矩阵
F, mask = cv2.findFundamentalMat(src_pts, dst_pts, cv2.USAC_MAGSAC, 0.15, 0.9999, 20000)
# 打印基础矩阵
print("Fundamental matrix:")
print(F)
```
在这个例子中,我们使用SIFT检测器检测关键点和描述符,然后匹配关键点。接下来,我们使用cv2.findFundamentalMat()函数计算基础矩阵F,并将它打印出来。
阅读全文