【计算机视觉】:(3)全景图像拼接

2023-05-16

图像映射与全景拼接

  • 1.全景拼接基本流程
  • 2. 图像映射流程
    • 2.1. 提取特征点,构建关键点描述符(SIFT特征提取)
    • 2.2. 特征匹配(KNN或kd树匹配)
    • 2.3. 根据图像变换特点,选取合适的变换类型
    • 2.4. 根据单应性变换等方法计算变换结构
    • 2.5. 采用正向或逆向映射,利用插值方式实现图像映射变换
  • 3. 图像拼接的几何原理
  • 3. 全景拼接流程
    • 3.1. SIFT特征匹配
    • 3.2. RANSAC算法
    • 3.4. APAP算法
    • 3.5. 寻找最佳拼接缝(Seam-finding),最大流最小割算法
    • 3.6. multi-band blending算法
  • 5. 代码实现
  • 6. 问题解决

1.全景拼接基本流程

① 针对某个场景拍摄多张/序列图像

② 计算第二张图像与第一张图像之间的变换关系

③ 将第二张图像叠加到第一张图像的坐标系中

④ 变换后的融合/合成

⑤ 在多图场景中,重复上述过程

2. 图像映射流程

2.1. 提取特征点,构建关键点描述符(SIFT特征提取)

2.2. 特征匹配(KNN或kd树匹配)

上述用到SIFT特征匹配算法,详情可见https://blog.csdn.net/qq_45802659/article/details/123769669

2.3. 根据图像变换特点,选取合适的变换类型

图像的映射类型有:平移、旋转、仿射、透视映射、尺度变换
在这里插入图片描述
刚体变换:平移+旋转,只改变物体位置,不改变物体形状
仿射变换:改变物体位置和形状,但是保持“平直性”(原来平行的边依然平行)
投影变换:彻底改变物体位置和形状
在这里插入图片描述
在这里插入图片描述

2.4. 根据单应性变换等方法计算变换结构

单应性变换是将一个平面内的点映射到另一个平面内的二维投影变换。实现单应变换的关键是求出单应性矩阵,而针对不同的变换类型需要相应数量的对应点对来求出相应的单应性矩阵(求解矩阵中的未知数)。
平移变换:2个自由度(需要一个点对)
相似变换:4个自由度(需要两个点对)
仿射变换:6个自由度(需要三个点对)
投影变换:8个自由度(需要四个点对)
在这里插入图片描述
在这里插入图片描述
进一步转换为:
在这里插入图片描述

写成矩阵Ah=0形式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

H单应性矩阵,8个自由度,矩阵可以缩放,使得 h 22 h_{22} h22为1,所以实际上是8个自由度,至少要4个点对(几个未知数几个方程),在真实的应用场景中,我们计算的点对中都会包含噪声。比如点的位置偏差几个像素,甚至出现特征点对误匹配的现象,如果只使用4个点对来计算单应矩阵,那会出现很大的误差。因此,为了使得计算更精确,一般都会使用远大于4个点对来计算单应矩阵。

可通过最小二乘法求解,但容易受到噪声影响,后面会用到RANSAC随机抽样一致算法计算单应性矩阵。
在这里插入图片描述

2.5. 采用正向或逆向映射,利用插值方式实现图像映射变换

给定变换模型 x’= h(x) ,以及输入图像f(x), 如何根据f(x)计算变换后的图像 g(x’) = f(h(x))?即有了单应性矩阵,我们应该就行像素的映射f(x)变为g(x’) 。两种方法:前向映射和逆向映射
前向映射:扫描原图的每个像素(x,y),变换后的值填入对应的(x’,y’)处。
对于多个像素点映射到同一个(x’,y’)的情况,不太好处理,所以反向映射更有效。在这里插入图片描述
当像素落在两个像素之间时:近邻插值
在这里插入图片描述
逆向映射:扫描变换后图像的每个像素(x‘,y’),根据逆变换找到原图中对应的(x,y)
大概率找到的不是整点,所以需要使用图像插值
在这里插入图片描述
当像素落在两个像素之间时:线性插值/双线性插值
在这里插入图片描述

主要的插值方法:
最近邻插值;
线性插值;
双线性插值;
三线性插值。

3. 图像拼接的几何原理

在这里插入图片描述在这里插入图片描述
• 全景融合的 3D 几何解释
– 图像被投影到共同的拼接平面上(同一坐标系)
– 在拼接平面上实现全景融合
– 在拼接的应用中,其实可以简化理解为 2D图像的变换,叠加过程

3. 全景拼接流程

  1. 根据给定图像/集,实现特征匹配
  2. 通过匹配特征计算图像之间的变换结构(RANSAC算法得出单应性矩阵)
  3. 利用图像变换结构,实现图像映射
  4. 针对叠加后的图像,采用APAP之类的算法,对齐特征点
  5. 通过图割方法,自动选取拼接缝
  6. 根据multi-band blending策略实现融合

3.1. SIFT特征匹配

此处不赘述,详情可见https://blog.csdn.net/qq_45802659/article/details/123769669

3.2. RANSAC算法

RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声(SIFT特征匹配虽然效果好但难免因为不同地方的类似图案出现匹配误差)。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。简单来说RANSAC反复取样找到误差最小的模型。

RANSAC算法,随机选取k个样本点拟合模型再设定阈值,计算其他点到该拟合模型的距离,小于阈值作为内点,统计内点个数,迭代计算出内点个数最多的模型。可以看出噪声影响小。而最小二乘容易受到噪声干扰。(比如RANSAC和最小二乘拟合直线、曲线等)

RANSAC算法步骤

  1. 随机选择四对匹配特征
  2. 根据直接线性变换解法DLT(图像映射中的推导过程)计算单应性矩阵 H (唯一解)
  3. 对所有匹配点,计算映射误差ε= ||pi’, H pi|| (可算欧式距离)
  4. 根据误差阈值,确定inliers(例如3-5像素)
  5. 针对最大inliers集合,重新计算单应矩阵 H(迭代计算,达到迭代次数就停止,求出符合最多匹配点对的H)

3.4. APAP算法

APAP参考:参考1;参考2
论文原文

由于图像是将三维景物显示在2D平面上,图像中的景物的三维信息丢失,所以拼接时经常会有“鬼影”的出现,对目前已有方法提出的单一映射矩阵,只能应用于输入图像在一个平面上,或者相机沿着同一个焦点旋转拍摄的图像。如果违背了这些约束条件,图像拼接就会产生鬼影现象。APAP的算法主旨是得到global projective,但是能容忍变换矩阵不够准确带来的局部偏差。
在这里插入图片描述
下图来自论文As-Projective-As-Possible Image Stitching with Moving DLT,来自CVPR 2013。
图中的点表示匹配上的特征点,横纵坐标表示匹配上的特征点的坐标位置,红线是拟合的模型即单应性矩阵。(a)用一个2x2的单一映射矩阵,从图可以看出局部偏差是不可避免的。(c)用APAP的方法,局部偏差更少,并且正确的推断出全局变换的趋势。
在这里插入图片描述

APAP算法全称As-Projective-As-Possible Image Stitching,也是图像拼接算法的一种。

APAP算法流程如下

  1. SIFT得到两幅图像的匹配点对
  2. 通过RANSAC剔除外点,得到N对内点
  3. 利用DLT和SVD计算全局单应性
  4. 将源图划分网格,取网格中心点,计算每个中心点和源图上内点之间的欧式距离和权重
  5. 将权重放到DLT算法的A矩阵中,构建成新的W*A矩阵,重新SVD分解,自然就得到了当前网格的局部单应性矩阵
  6. 遍历每个网格,利用局部单应性矩阵映射到全景画布上,就得到了APAP变换后的源图
  7. 最后就是进行拼接线的加权融合

如果两幅待拼接的图像只有旋转变换或者拍摄同一平面的场景,那么原先的公式 x ′ ~ = H x ~ \tilde{x^{'}}=H\tilde{x} x~=Hx~可以计算出准确的投影矩阵。如果不能满足这个条件,那计算出来的变换矩阵就会存在误差。矩阵存在误差的结果就是,拼接的结果在两张图像的重叠区域会出现鬼影。为了解决这个问题,论文的中心思想是对每个像素点x使用局部单一映射矩阵。
x ∗ ′ ~ = H ∗ x ∗ ~ \tilde{x_{*}^{'}}=H_*\tilde{x_{*}} x~=Hx~
每次的局部单应性矩阵都要加上权重w
在这里插入图片描述
权重会随着像素x变化,其中,σ 是比例系数, x i x_i xi是原始图像的匹配的特征点的坐标。从公式可以看出,离像素点x越近的特征点的权重越高。同样地,随着x在图像域连续平移,计算的变换矩阵H也是平缓变化的。

在这里插入图片描述
改写成:
在这里插入图片描述
太远的点权重不稳定过于接近0,通过γ抵消权重
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5. 寻找最佳拼接缝(Seam-finding),最大流最小割算法

参考
最小割集的流量之和=网络中的最大流在这里插入图片描述
每个重叠区域都会包含Patch A和Patch B对应的像素点,这个时候采用最小割算法,将重叠部分以图的形式表示,边的权重计算方式如上表示,最后找到权重最小的割线作为拼接缝。最大流算法的结果=最小割算法的结果。

将匹配点最为接近的点作为拼接缝上的点,最终构造出拼接缝。

3.6. multi-band blending算法

参考1
参考2
在通过图割算法找到拼接缝后,由于图像光照、噪声等因素,会使拼接缝很突兀。而multi-band blending算法通过图像融合消除边缘痕迹。融合目的在于拼缝消除, Multi-Band能够达到比较好的融合效果,但是效率低,采用Laplacian(拉普拉斯)金字塔,通过对相邻两层的高斯金字塔进行差分,将原图分解成不同尺度的子图,对每一个之图进行加权平均,得到每一层的融合结果,最后进行金字塔的反向重建,得到最终融合效果过程。
在这里插入图片描述思想:采用的方法是直接对带拼接的两个图片进行拉普拉斯金字塔分解,后一半对前一半进行融合。
步骤:
(1)首先计算当前待拼接图像和已合成图像的重叠部分。
在这里插入图片描述
(2)两幅图像的融合:分别构建图像A、B的高斯金字塔和拉普拉斯金字塔,然后进行加权融合。
在这里插入图片描述
(3)对加权后的拉普拉斯金字塔进行重构。
在这里插入图片描述

5. 代码实现

from pylab import *
from numpy import *
from PIL import Image
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift
# from scipy.spatial import Delaunay


# 设置数据文件夹的路径
featname = ['D:\study\计算机视觉\code\code3\image' + str(i + 1) + '.sift' for i in range(3)]
imname = ['D:\study\计算机视觉\code\code3\image' + str(i + 1) + '.jpg' for i in range(3)]

# 提取特征并匹配使用sift算法
l = {}
d = {}
for i in range(3):
    sift.process_image(imname[i], featname[i])
    l[i], d[i] = sift.read_features_from_file(featname[i])

matches = {}
for i in range(2):
    matches[i] = sift.match(d[i + 1], d[i])

# 可视化匹配
for i in range(2):
    im1 = array(Image.open(imname[i]))
    im2 = array(Image.open(imname[i + 1]))
    figure()
    sift.plot_matches(im2, im1, l[i + 1], l[i], matches[i], show_below=True)


# 将匹配转换成齐次坐标点的函数
def convert_points(j):
    ndx = matches[j].nonzero()[0]
    fp = homography.make_homog(l[j + 1][ndx, :2].T)
    ndx2 = [int(matches[j][i]) for i in ndx]
    tp = homography.make_homog(l[j][ndx2, :2].T)

    # switch x and y - TODO this should move elsewhere
    fp = vstack([fp[1], fp[0], fp[2]])
    tp = vstack([tp[1], tp[0], tp[2]])
    return fp, tp


# 估计单应性矩阵
model = homography.RansacModel()

fp, tp = convert_points(1)
H_12 = homography.H_from_ransac(fp, tp, model)[0]  # im 1 to 2

fp, tp = convert_points(0)
H_01 = homography.H_from_ransac(fp, tp, model)[0]  # im 0 to 1

# 扭曲图像
delta = 500  # for padding and translation用于填充和平移

im1 = array(Image.open(imname[1]), "uint8")
im2 = array(Image.open(imname[2]), "uint8")
im_12 = warp.panorama(H_12, im1, im2, delta, delta)

im1 = array(Image.open(imname[0]), "f")
im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta)

figure()
imshow(array(im_02, "uint8"))
axis('off')
show()

结果:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6. 问题解决

No module named 'matplotlib.delaunay’问题解决见博客
解决方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机视觉】:(3)全景图像拼接 的相关文章

  • 构建一个arm裸板轻量级的printf

    构建一个arm裸板轻量级的printf span class token keyword typedef span span class token keyword char span span class token operator s
  • 二维小游戏,飞机大战,图片素材

    二维小游戏 xff0c 飞机大战 xff0c 图片素材 高清大图下载链接 https download csdn net download qq 45706825 15042600
  • hallib_RTC

    RTC 一 配置参数 1 2 只有使能RTC之后才能选LSE 二 编写应用代码 1 在mspinit里面加上这个函数 xff0c 打开秒中断 xff0c 这个函数在 h文件里面 span class token function HAL R
  • hullib_Tim3TiggerAdc1

    Tim3TiggerAdc1 只有Tim3才可以用更新 xff08 TIM TRGO UPDATE xff09 触发adc xff0c 其他定时器都要用输出比较模式才可以 一 cubmax配置 1 配置tim3为500ms更新 xff0c
  • hullib_AdcBase

    AdcBase 也就是不用中断 xff0c 每次用软件触发的简单操作 一 cubmax配置 1 选好通道就可以了 xff0c 其他都不用管 二 需要编写的代码 1 在main函数while里面写上 span class token keyw
  • hullib_eeprom

    EEPROM 这个模拟iic真的搞了好久啊 xff0c 最后发现这个24c02写完之后至少要延时4ms再来读才可以 xff0c 要不然读的时候都是NACK 一 时序 自己看数据手册吧
  • hullib_PwmCapture

    PwmCapture 需要两个channel 一 cubemx配置 一个上升沿捕获 xff0c 一个下降沿捕获 打开中断 二 自己写的代码 1 开启两个通道的中断 span class token function HAL TIM IC S
  • 2021-03-16

    hullib Rtc 获取时间之后必须获取日期他才会有时间 HAL RTC GetTime amp hrtc amp sTime RTC FORMAT BIN HAL RTC GetDate amp hrtc amp sDate RTC F
  • hullib_PwmOutput

    hullib PwmOutput 一 cubmx需要配置的 1 这里一定是pwm Generation 而不是pwm outcompare 使用定时器的PWM模式只能在4个通道产生频率相同但占空比不同的输出信号 使用定时器的输出比较模式可以
  • 计算机类非全日制研究生

    北京市 10002 中国人民大学 院系所专业研究方向考试范围 159 信息学院 xff08 专业学位 xff09 085400 专业学位 电子信息 02 软件工程领域 xff08 非全 xff09 详情 159 信息学院 xff08 专业学
  • 史上最详细的Docker 镜像的制作-上传-拉取--部署(阿里云)

    Docker 镜像的制作 上传 拉取 部署 一 镜像 xff08 images xff09 1 什么是镜像 xff1f 2 镜像的组成和用途 xff08 1 xff09 Dockerfile xff08 2 xff09 scratch xf
  • 机动目标跟踪-Singer模型,当前统计模型,交互多模型与卡尔曼滤波的结合

    文章目录 非机动目标跟踪算法原理一 Singer 模型算法二 当前统计模型算法三 交互多模型算法 实验仿真一 低机动情况1 1 Singer模型参数设置1 2 当前统计模型参数设置1 3交互多模型参数设置1 4 对比分析 二 一般机动情况2
  • 用大白话解析函数调用,系统调用和API之间的关系

    一 官方的解释 大概了解一下 函数调用 函数调用是计算机编或运行时 xff0c 使用某个函数来完成相关命令 系统调用 系统调用是用户在程序中使用 访管指令 调用由操作系统提供的子功能集合 API 应用编程接口 xff08 Applicati
  • docker删除所有容器和镜像

    确保自己有权限 xff0c 一般先执行下面的命令获取管理员权限 span class token function sudo span span class token function su span 1 杀死运行的容器 xff1a sp
  • Docker镜像制作与仓库搭建

    Docker 1 xff0c docker镜像制作2 xff0c docker仓库搭建 1 xff0c docker镜像制作 docker官方和个人发布的镜像由于版本等各种原因 xff0c 漏洞较多 xff0c 已统计Docker Hub超
  • 2019年全国大学生电子设计竞赛赛题分享与浅析

    0 ti杯2019年全国大学生电子设计竞赛赛题已于今晨公布 其中赛题分为本科组与高职高专组 xff1a 本科组 xff1a A 电动小车动态无线充电系统 B 巡线机器人 C 线路负载及故障检测装置 D 简易电路特性测试仪 E 基于互联网的信
  • springboot整合canal实现对mysql数据库实时监控

    canal Canal介绍Mysql环境准备安装canalspringboot整合canal Canal介绍 官网地址 xff1a https github com alibaba canal canal k n l xff0c 译意为水道
  • tensorflow2.6.0安装 another metric with the same name already exists

    终端直接输入pip install tensorflow 61 61 2 6 0 但是这里有一点问题 span class token keyword import span os span class token keyword impo
  • Java编程心得体会

    初次学习Java编程的心得与体会 之前学习过c语言 xff0c python编程 xff0c 对比Java编程首先感觉到的区别就是Java环境配置比较复杂 xff0c 编程工具安装比较麻烦 课堂上老师讲到首先下载安装jdk xff0c 然后
  • Ubuntu18.04+ROS-melodic环境 px4+move_base仿真遇到的问题

    前前后后安了三个虚拟机 xff0c 折腾了快一个月了吧 第四次用双系统终于实现了 每次都有不同的坑 1 错误 xff1a gz symbol lookup error usr lib x86 64 linux gnu libgazebo c

随机推荐

  • 【谷粒学院】项目总结

    做谷粒学院这个项目大概花了2个多月的时间 xff0c 期间遇到了很多问题 xff0c 想要记录下来 xff0c 希望可以对别人有所帮助 首先谷粒学院项目我是不太推荐时间紧张的友友拿来做为毕设项目的 xff0c 原因是里面涉及到的技术 服务很
  • 完美解决make -f Makefile.unx报错问题 +Centos

    这里写自定义目录标题 本人亲测成功 导读 xff1a 我用这个命令主要是针对编译hadoop的 xff0c 其中有个isa l安装 xff0c 是英特尔 ISA L技术即 xff08 Intel Intelligent Storage Ac
  • 关于Gitee创建存储库多人协作流程

    关于Gitee创建存储库多人协作流程 主要解决在IDEA工具开发下通过Gtiee多人协作 xff0c 共同开发 前期准备 IDEA xff1a IDEA当前文档使用版本为2021 3 1 Git xff1a IDEA安装Gitee插件 流程
  • ajax上传文件,图片并显示与删除(spring boot)

    思路 xff1a 先上传文件然后在读出来 之前本人都是用form提交上传文件 xff0c 现在写个ajax的文件上传 先看下效果 xff1a 上传并在页面显示 关键代码 xff1a 在启动类里面加入 span class token com
  • opencv-python——调用摄像头或导入视频实现颜色识别并画框

    采用opencv进行颜色识别有个好处就是他的框可以是具有角度的长方体框 xff0c 不局限于平行点的 文章目录 颜色识别实现过程1 调用摄像头 导入视频或读入照片2 找出所需颜色对应的HSV阈值3 找出二值化后的图片中的特征点并进行画框 完
  • Ubuntu18.04——python2安装opencv4.1版本并代替ROS自带的低版本opencv

    软件环境 Ubuntu 18 04系统ROS melodic 查看安装ROS默认安装的CV2位置 改个名 xff0c 不要是cv2就ok xff1a 查看是否移除 可以发现还有一个cv2的so文件 xff0c 所以我们需要将这个也移除 改个
  • 直流电机驱动电路设计-----学习笔记

    直流电机驱动电路的设计目标 在直流电机驱动电路的设计中 xff0c 主要考虑一下几点 xff1a 1 功能 xff1a 电机是单向还是双向转动 需不需要调速 对于单向的电机驱动 xff0c 只要用一个大功率三极管或场效应管或继电器直接带动电
  • ROS——问题解决:rqt工具包中image_view消失;bash: rosrun rqt_image_view未找到命令

    重装rqt工具 span class token function sudo span span class token function apt get span span class token function install spa
  • VS Code——Git插件使用指南

    文章目录 一 基于VScode本地新建工程并上传到Github1 新建工程文件夹并用Vscode打开该文件夹2 初始化存储库3 暂存更改4 提交暂存更改5 同步到Github中6 在Github中查看项目 二 Git clone到本地后进行
  • Ubuntu18.04——查看CPU, GPU,内存利用率

    htop查看CPU和内存利用率 sudo apt install htop 启动htop htop 查看NVIDIA GPU利用率 nvidia smi 以每秒1次的刷新频率实时查看 nvidia smi l 1
  • Ubuntu18.04——基于X86和Arm安装并配置Realsense-ros环境

    文章目录 基础安装1 安装ROS2 安装Realsense驱动以及依赖库 xff08 1 xff09 X86安装librealsense更新 xff08 2 xff09 Arm编译安装librealsense xff08 或者Apt无法下载
  • 【Rt-Thread】STM32输出PWM

    1 实验目标 STM32输出不同频率的占空比为50 的PWM信号 xff0c 控制蜂鸣器音调 2 硬件部分 2 1 模块介绍 xff08 1 xff09 主控芯片 F405RGT6 xff08 2 xff09 蜂鸣器 低电平触发 2 2 接
  • 考研复试实用指南

    Preface 考研初试已经结束 xff0c 但是考研这场仗还没打完 xff0c 接下来 xff0c 我们将走入复试的战场 考研复试并不是走过场 xff0c 是有严格的淘汰比例的 xff1b 考研复试并不是关系网 xff0c 是有公开而透明
  • 2020oop第一次练习 6-3 字符串 - 6. 查找子串(BF算法) (10分)

    C语言标准函数库中包括 strstr 函数 xff0c 在主串中查找子串 作为练习 xff0c 我们自己编写一个功能与之相同的函数 函数原型 char StrStr const char txt const char pat 说明 xff1
  • 信号量——二值信号量

    信号量 二值信号量 信号量简介 信号量是操作系统的重要部分 xff0c 信号量一般用来进行资源管理和任务同步 FreeRTOS中信号量分为二值信号量 互斥信号量 计数信号量和递归互斥信号量 xff0c 应用场景各不同 二值信号量 二值信号量
  • switch case语句的用法

    switch case语句的用法 我们首先来看一下switch case 语句的一般形式是怎样的 span class token keyword switch span xff08 表达式 xff09 xff5b span class t
  • C++容器作为函数形参进行使用

    C 43 43 容器作为函数形参进行使用 如这个编程题 xff1a 该题是对容器的简单应用 xff0c 由于数组在定义的时候要么用列表初始化间接告诉编译器数组的大小 xff0c 要么在定义的时候直接定义它的大小如 xff1a int arr
  • 任正非被遗漏的讲话:怎么做一个谦虚的领导者?(转)

    任正非曾在市场大会做过一个叫 做谦虚的领导者 的讲话 xff0c 少有媒体和社会层面的关注 xff0c 甚至内部也未有什么波澜 但细看起来 xff0c 这个讲话基本上是华为的管理纲要 xff0c 如 xff1a 以利润为中心 xff1b 建
  • stm32f4 mpu6050与姿态解算(仅供自己学习使用,学习笔记)

    IMU原理及姿态融合算法详解 一 陀螺仪的组成原理1 xff09 加速度计2 xff09 陀螺仪3 xff09 磁力计 二 椭球拟合三 姿态的描述1 坐标系载体坐标系当地导航坐标系载体坐标系 2 四元数3 欧拉角4 xff09 旋转矩阵 四
  • 【计算机视觉】:(3)全景图像拼接

    图像映射与全景拼接 1 全景拼接基本流程2 图像映射流程2 1 提取特征点 xff0c 构建关键点描述符 xff08 SIFT特征提取 xff09 2 2 特征匹配 xff08 KNN或kd树匹配 xff09 2 3 根据图像变换特点 xf