地图影像匹配:基于特征匹配的视觉定位2,python

根据之前视频防抖的代码,重新写了一套。能够输出缩放、旋转的信息。

  • 代码

    import cv2
    import numpy as np
    import argparse
    import os
    import re
    import math
    import matplotlib.pyplot as plt
    import time

    def show_image(image):
    plt.figure(figsize=(15, 10))
    plt.imshow(image)
    plt.title('Feature Matching Results')
    plt.show()

    def process_transform(refer_kp, drone_kp, matches, drone_frame):
    # 提取匹配点的坐标
    refer_pts = np.float32([refer_kp[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
    drone_pts = np.float32([drone_kp[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)

    复制代码
      # 计算单应性矩阵
      H, mask = cv2.findHomography(drone_pts, refer_pts, cv2.RANSAC, 5.0)
          
      if H is None:
          print(f"无法计算 {frame_files[i]} 的变换矩阵,使用上一帧的变换")
          # 如果无法计算,使用恒等变换
          H = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
          
      # 从单应性矩阵中提取变换信息
      scale        = np.sqrt(H[0,0]**2 + H[1,0]** 2)
      rotation_rad = math.atan2(H[1,0], H[0,0])
      rotation_deg = math.degrees(rotation_rad)
      x_offset     = H[0,2]
      y_offset     = H[1,2]
      print('transform: scale=%.2f, rotation_rad=%.2f, rotation_deg=%.2f, x_offset=%.2f, y_offset=%.2f' % (scale, rotation_rad, rotation_deg, x_offset, y_offset))
          
      # 应用变换矩阵进行修正
      # height, width  = drone_frame.shape[:2]
      # adjusted_frame = cv2.warpPerspective(drone_frame, H, (width, height))
      # cv2.imwrite(adjusted_frame_path, adjusted_frame)

    def process_frame(frame):
    # 读取第一帧作为初始基准帧
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    复制代码
      # 检测基准帧的特征点和描述符
      kp, des = orb.detectAndCompute(gray, None)
      return frame, gray, kp, des

    def map_match(reference, drone):

    复制代码
      current_time = time.time()
      refer_frame, refer_gray, refer_kp, refer_des = process_frame(reference)
      drone_frame, drone_gray, drone_kp, drone_des = process_frame(drone)
          
      # 匹配特征点(当前帧与上一调整后的帧)
      matches = matcher.match(refer_des, drone_des)
      # 按匹配距离排序,取前100个最佳匹配
      matches = sorted(matches, key=lambda x: x.distance)[:10]
          
      process_transform(refer_kp, drone_kp, matches, drone_frame)
    
      print('cost time: %.2f ms' % ((time.time()-current_time)*1000))
      
      match_img = cv2.drawMatches(refer_frame, refer_kp,
                             drone_frame, drone_kp,
                             matches, None,
                             flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
    
      show_image(match_img)

    初始化ORB特征检测器和匹配器

    orb = cv2.ORB_create(1000)
    matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

    if name == "main":
    for index in range(1, 10):
    image1 = ('images/map-%02d.jpg' % ((index-1)*3))
    image1 = cv2.imread(image1)
    image2 = ('images/map-%02d.jpg' % ( index *3))
    image2 = cv2.imread(image2)
    map_match(image1, image2)

  • 效果

准确的计算出旋转角度,90。

复制代码
transform: scale=0.72, rotation_rad=-1.57, rotation_deg=-89.81, x_offset=184.79, y_offset=737.42
cost time: 45.87 ms
相关推荐
AI、少年郎几秒前
如何用个人电脑快速训练自己的语言模型?MiniMind 全流程实战指南
人工智能·python·神经网络·ai·自然语言处理·大模型·模型训练微调
王家视频教程图书馆2 分钟前
rust 写gui 程序 最流行的是哪个
开发语言·后端·rust
枫叶林FYL4 分钟前
【Python高级工程与架构实战】项目四 现代ETL编排平台:Airflow + dbt + Snowflake 企业级数据管道架构与实现
人工智能·python·架构·etl
源码之屋5 分钟前
计算机毕业设计:Python天气数据采集与可视化分析平台 Django框架 线性回归 数据分析 大数据 机器学习 大模型 气象数据(建议收藏)✅
人工智能·python·深度学习·算法·django·线性回归·课程设计
Wadli5 分钟前
Oncall Agent项目
开发语言
艾莉丝努力练剑10 分钟前
【QT】Qt常用控件与布局管理深度解析:从原理到实践的架构思考
linux·运维·服务器·开发语言·网络·qt·架构
捧月华如11 分钟前
React vs Vue vs Angular:三大前端框架深度对比
python·github
AI_Claude_code11 分钟前
安全与合规核心:匿名化、日志策略与法律风险规避
网络·爬虫·python·tcp/ip·安全·http·网络爬虫
杜子不疼.12 分钟前
用 Python 实现 RAG:从文档加载到语义检索全流程
开发语言·人工智能·python