@#¥&3 2024-09-17 16:12 采纳率: 90.9%
浏览 1
已结题

如何使用OpenCV进行图像拼(Image Stitching)来创建全景图?

我有多张重叠的图像,需要将它们拼接在一起以创建一个全景图。请编写一个Python程序使用OpenCV完成这一任务,并解释其中涉及的关键步骤和难点。特别注意如何处理图像之间的对齐、特征检测、匹配和拼接的平滑处理。

  • 写回答

1条回答 默认 最新

  • 小ᶻZ࿆ 2024-09-17 16:18
    关注
    import cv2
    import numpy as np
    
    def stitch_images(image_paths):
        # Load images
        images = [cv2.imread(path) for path in image_paths]
        
        # Check if images are loaded successfully
        if any(image is None for image in images):
            print("Error loading images.")
            return None
        
        # Initialize SIFT detector
        sift = cv2.SIFT_create()
    
        # Detect keypoints and descriptors for each image
        keypoints_descriptors = [sift.detectAndCompute(image, None) for image in images]
    
        # Initialize BFMatcher
        bf = cv2.BFMatcher()
    
        # Find matches between images
        matches = [bf.knnMatch(keypoints_descriptors[i][1], keypoints_descriptors[i+1][1], k=2) 
                   for i in range(len(images) - 1)]
    
        # Apply ratio test and extract good matches
        good_matches = []
        for m in matches:
            good = []
            for m, n in m:
                if m.distance < 0.75 * n.distance:
                    good.append(m)
            good_matches.append(good)
    
        # Check if enough matches are found
        if any(len(g) < 10 for g in good_matches):
            print("Not enough matches found for stitching.")
            return None
    
        # Find homography and stitch images
        result = images[0]
        for i in range(len(images) - 1):
            src_pts = np.float32([keypoints_descriptors[i][0][m.queryIdx].pt for m in good_matches[i]]).reshape(-1, 1, 2)
            dst_pts = np.float32([keypoints_descriptors[i+1][0][m.trainIdx].pt for m in good_matches[i]]).reshape(-1, 1, 2)
    
            # Compute homography
            H, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
    
            # Warp image
            h, w = images[i+1].shape[:2]
            result = cv2.warpPerspective(result, H, (result.shape[1] + w, result.shape[0]))
            result[0:h, 0:w] = images[i+1]
    
        # Show result
        cv2.imshow('Stitched Image', result)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
        return result
    
    # Example usage
    image_paths = ['image1.jpg', 'image2.jpg', 'image3.jpg']
    stitch_images(image_paths)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月17日
  • 已采纳回答 9月17日
  • 创建了问题 9月17日

悬赏问题

  • ¥15 verilog 非阻塞赋值下的移位拼接错误
  • ¥100 两个按钮控制一个LED
  • ¥15 用C语言写离散数学相关问题
  • ¥30 如何用python的GephiStreamer连接到gephi中,把Python和Gephi的具体操作过程都展示,重点回答Gephi软件的调试,以及如果代码的端口在浏览器中无法显示怎么处理
  • ¥15 ansys机翼建模肋参数
  • ¥15 Sumo软件无法运行
  • ¥15 如何在vscode里搭建stata的编辑环境?
  • ¥15 dify知识库创建问题
  • ¥15 如何用C#的chart画1000万个点不卡顿
  • ¥15 爬虫技术找到网上看过房源客户的电话