python的opencv 拼接两张图片
时间: 2025-01-02 13:18:35 浏览: 34
### 使用Python OpenCV库拼接两张图像
为了使用Python中的OpenCV库来拼接两张图像,可以采用水平或垂直的方式进行简单拼接。对于更复杂的场景,比如创建全景图,则可能需要用到`Stitcher`类。
#### 方法一:简单的水平和垂直拼接
通过NumPy的`hstack`函数可实现两幅相同高度图像的水平拼接;而利用`vstack`则适用于宽度一致的情况下的垂直方向上的连接[^1]:
```python
import cv2
import numpy as np
# 加载要拼接的第一张图片
img1 = cv2.imread('imageA.jpg')
# 加载第二张待拼接的图片
img2 = cv2.imread('imageB.jpg')
# 确保两张图片尺寸匹配以便于后续操作
if img1.shape[:2] != img2.shape[:2]:
# 如果大小不一致,调整其中一张至另一张相同的分辨率
img2 = cv2.resize(img2, dsize=(img1.shape[1], img1.shape[0]))
# 执行水平拼接
horizontal_concatenation = np.hstack((img1, img2))
cv2.imshow("Horizontal Concatenated Image", horizontal_concatenation)
# 或者执行垂直拼接
vertical_concatenation = np.vstack((img1, img2))
cv2.imshow("Vertical Concatenated Image", vertical_concatenation)
cv2.waitKey()
cv2.destroyAllWindows()
```
这种方法适合处理那些已经预先裁剪好的、具有相似特征区域或者完全不需要考虑对齐问题的照片组合。
#### 方法二:基于特征点检测与描述符匹配的自动拼接
当面对多视角拍摄得到的不同角度照片时,仅靠上述基础方式难以获得理想效果。此时应借助SIFT/SURF等算法提取关键点并计算描述子向量,在此基础上寻找最佳配对关系完成无缝融合[^3]:
```python
from imutils import paths
import cv2
import os
class Stitcher:
def __init__(self):
pass
def stitch(self, images, ratio=0.75, reprojThresh=4.0,
showMatches=False):
(imageB, imageA) = images
kpsA, featuresA = self.detectAndDescribe(imageA)
kpsB, featuresB = self.detectAndDescribe(imageB)
M = self.matchKeypoints(kpsA, kpsB,
featuresA, featuresB, ratio, reprojThresh)
if M is None:
return None
matches, H, status = M
result = cv2.warpPerspective(imageA, H,
(imageA.shape[1]+imageB.shape[1],
imageA.shape[0]))
result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB
if showMatches:
vis = self.drawMatches(imageA, imageB, kpsA, kpsB, matches,
status)
return (result, vis)
return result
def detectAndDescribe(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
descriptor = cv2.SIFT_create()
(kps, features) = descriptor.detectAndCompute(gray, None)
kps = np.float32([kp.pt for kp in kps])
return (kps, features)
stitcher = Stitcher()
images_path = ['path_to_image_A', 'path_to_image_B']
images = []
for imagePath in images_path:
image = cv2.imread(imagePath)
images.append(image)
(result, matched_points_vis) = stitcher.stitch(images, showMatches=True)
cv2.imwrite("matched_points.png", matched_points_vis)
cv2.imwrite("panorama_result.png", result)
```
这段代码定义了一个名为`Stitcher`的类用于管理整个过程——从加载输入文件到最终保存输出成果。注意这里引入了额外的帮助函数`detectAndDescribe()`负责具体的关键点定位工作,并且实现了可视化功能方便查看中间步骤的结果。
阅读全文