opencv Python 立体图像拼接代码
时间: 2023-11-05 07:02:26 浏览: 45
以下是一个简单的立体图像拼接代码示例,使用Python和OpenCV库实现:
```python
import cv2
import numpy as np
# 读取左右图像
img_left = cv2.imread('left.jpg')
img_right = cv2.imread('right.jpg')
# 转换为灰度图像
gray_left = cv2.cvtColor(img_left, cv2.COLOR_BGR2GRAY)
gray_right = cv2.cvtColor(img_right, cv2.COLOR_BGR2GRAY)
# 初始化SIFT检测器
sift = cv2.xfeatures2d.SIFT_create()
# 使用SIFT检测关键点和描述符
kp_left, des_left = sift.detectAndCompute(gray_left, None)
kp_right, des_right = sift.detectAndCompute(gray_right, None)
# 使用FLANN匹配器进行关键点匹配
flann = cv2.FlannBasedMatcher()
matches = flann.knnMatch(des_left, des_right, k=2)
# 根据Lowe's ratio test进行筛选
good_matches = []
for m, n in matches:
if m.distance < 0.7 * n.distance:
good_matches.append(m)
# 从匹配的关键点中提取左右图像的对应点
pts_left = np.float32([kp_left[m.queryIdx].pt for m in good_matches])
pts_right = np.float32([kp_right[m.trainIdx].pt for m in good_matches])
# 计算基础矩阵
F, mask = cv2.findFundamentalMat(pts_left, pts_right, cv2.FM_RANSAC)
# 从基础矩阵中提取左右图像的对应点
pts_left = pts_left[mask.ravel() == 1]
pts_right = pts_right[mask.ravel() == 1]
# 根据对应点计算左右图像的单应性矩阵
H_left, _ = cv2.findHomography(pts_left, pts_right, cv2.RANSAC, 5.0)
H_right, _ = cv2.findHomography(pts_right, pts_left, cv2.RANSAC, 5.0)
# 将左右图像进行单应性变换
img_left_warped = cv2.warpPerspective(img_left, H_left, (img_left.shape[1], img_left.shape[0]))
img_right_warped = cv2.warpPerspective(img_right, H_right, (img_right.shape[1], img_right.shape[0]))
# 将两幅图像拼接在一起
result = np.zeros((img_left.shape[0], img_left.shape[1]*2, img_left.shape[2]), dtype=np.uint8)
result[:, :img_left.shape[1], :] = img_left_warped
result[:, img_left.shape[1]:, :] = img_right_warped
# 显示拼接结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码首先读取左右图像,然后将它们转换为灰度图像,并使用SIFT检测器检测关键点和描述符。然后使用FLANN匹配器进行关键点匹配,并根据Lowe's ratio test进行筛选,提取出左右图像的对应点。
接下来,使用OpenCV的`findFundamentalMat`函数计算基础矩阵,并从基础矩阵中提取左右图像的对应点。然后使用`findHomography`函数分别计算左右图像的单应性矩阵,并将它们应用到左右图像上,使它们对齐。
最后,将左右图像拼接在一起,并显示拼接结果。