K-M算法(图像凭借特征点匹配)

K-M算法,也被称为匈牙利算法。
二分图匹配算法,K-M也可以应用到图像拼接上的特征点匹配。
其主要利用两个可行顶标的调节以及等价子图的生成,从而加权二分图退化成无权二分图,最后利用寻求增广矩阵来求解无权二分图的最佳匹配。
先投票处理(枚举)任意可能的每对MLD特征之间的距离(汉明距离 两个先行描述符进行异或中1的个数)

//时间复杂度为O(n^3) 
#include <bits/stdc++.h>
using namespace std;
const in N = 1e4 + 10;
//N待定
vector<int> MLD1[N], MLD2[N];
//二分图所以要分开存储两组MLD特征 计算两组MLD之间的汉明距离
int w[N][N]; 
int tsd;
//upd[j] 表示与右部节点 j 匹配的所有左部节点 i 中,la[i] + lb[j] - w[i][j] 的最小值
int upd[N];
bool ast[N], bst[N]; //记录左、右部节点是否在交错树中
int match[N]; //记录每个右部节点匹配了哪一个左部节点
int last[N]; //记录每个右部节点的最小upd值对应的左部节点
int find(int x, int fa) {ast[u] = 1;for (int i = 0; i < N2; i ++ ){if (!bst[i]){if (la[u] + lb[i] == w[u][i]){bst[i] = 1;last[i] = u;//?if (match[i] == 0 || find(match[i], i)){//判断是否匹配对象或者用find函数递归找到匹配对象的增广路径并更新match[i] = u;return 1;}}else if (upd[i] > la[u] + lb[i] - w[u][i]){upd[i] = la[u] + lb[i] - w[u][i];last[i] = u;}}}return 0;
} void km(){for (int i = 0; i < N1; i ++){lx[i] = max(lx[i], w[i][j]);}memset(ly, -1, sizeof ly);for (int i = 0; i < N1; i ++ ){//为所有左部节点进行匹配 //初始化memset(ast, 0, sizeof ast);memset(bst, 0, sizeof bst);memset(upd, 0x3f, sizeof upd);//从右部节点st匹配的左节点match[st]开始匹配,一开始假设有一条0-i的匹配int st = 0;match[0] = i;while(match[st]){int minn = 0x3f3f3f3f;if (find(match[st], st)) break;//匹配失败修改顶标,在这之前需要找出最小的upd值 for (int j = 0; j < N2; j ++ ) {if((!bst[j] && minn > upd[j])){minn = upd[j];st = j;//下一次直接从最小边开始搜索} }//修改顶标for (int j = 0;j < N2; j ++ ){if(ast[j]) la[j] -= minn; //将交错树中的左部节点减去最小upd值if(bst[j]) lb[j] += minn; //将交错树中的右部节点加上最小upd值else upd[j] -= minn; //能匹配到的左部节点已经减去最小upd值,对应的upd值也需要减去最小upd值} bst[st] = 1;}while(st) //倒退更新增广路径{match[st] = match[last[st]];st = last[st];}}
}
int main()
{//输入 MLD1 MLD2 tsdfor (int i = 0;i < N1; i ++ ){for (int j = 0; j < N2; j ++ ){w[i][j] = 0;for (int d1 = 0; d1 != MLD1[i].size(); d1 ++ ) {//MLD1[i]中任一线段描述符 for (int d2 = 0; d2 != MLD2[j].size(); d2 ++ ) {//MLD2[j]中任一线段描述符 res = POPCNT(MLD1[i][d1] ^ MLD2[j][d2]);//异或后1的个数  1越少距离越近 //但是这里可以二分图最大权重匹配 所以加上了n-res if (res < tsd) w[i][j] = w[i][j] + n - res;}}}} //生成两组可行顶标lx[N1] ly[N2] 一定要保证N1<=N2//对于每一个左侧点有一个顶标lx[i],初始时为i连出边的最大值//对于每一个右侧的点也有个顶标ly[j],初始时为0//在任何时候,对于一条i连向j的边e,满足lx[i] + ly[j] >= e//定义一个原图的子图 G",其中的边满足 lx[i]+ly[j]=we,初始状态下子图由左侧点连出的最大边构成//应该模仿匈牙利算法,在增广路上寻找(bfs),由于没有最大匹配,可能需要降低某个左侧点的标准km();for (int i = 0; i < N1; i ++ ) cout << match[i] << "\n";return 0;} 

基于网格优化的图像对齐算法

对极几何约束

极几何约束的投影模型是立体视觉中的核心,涉及描述两张图像之间的几何关系,特别是如何从两张不同视角的图像推导出关于三维场景的信息。其推导过程通常从投影几何的基本概念出发,结合相机模型,最终导出极几何约束。
假设三位世界点 P = ( X , Y , Z ) T P = (X,Y,Z)^{T} P=(X,Y,Z)T通过相机投影到图像平面上的点 x = ( x , y , 1 ) T x = (x,y,1)^{T} x=(x,y,1)T
在齐次坐标下,相机投影可以通过一下公式表示: x = K [ R ∣ t ] P x = K[R|t]P x=K[Rt]P

  • K是相机的内参矩阵,包含了相机的焦距和主点位置等信息;
  • R是相机的旋转矩阵;
  • t是相机的平移向量;
  • [ R ∣ t ] [R|t] [Rt]形成了相机的外参矩阵
    对于两个不同的视角,假设我们有两个相机 C1 和 C2 ,它们分别有相应的内参矩阵K1,K2 ,旋转矩阵 R1,R2,以及平移向量 t1,t2 。
    相机C1中,点P的投影为: x 1 = K 1 [ R 1 ∣ t 1 ] P x1 = K1[R1|t1]P x1=K1[R1∣t1]P
    相机C2中,点P的投影为: x 2 = K 2 [ R 2 ∣ t 2 ] P x2 = K2[R2|t2]P x2=K2[R2∣t2]P
    对于任意一对对应的图像点x1和x2,他们必须满足:
    x 2 T F x 1 = 0 x2^{T}Fx1 = 0 x2TFx1=0
    F为基础矩阵,基础矩阵是一个 3x3 的矩阵,它的存在确保了对应点满足极线约束。
    计算基础矩阵F通过公式计算:
    F = K 2 − T [ t ✖ R ] K 1 − 1 F = K2^{-T}[t✖R]K1^{-1} F=K2T[tR]K11(三维)
本质矩阵

本质矩阵E是描述两个相机坐标系下的对应点之间的几何关系的矩阵。它与基础矩阵类似,都满足极几何约束,但是本质矩阵适用于两个相机已知内参的情况。
x 2 T E x 1 = 0 x2^{T}Ex1 = 0 x2TEx1=0
E和F之间的关系:
E = K 2 T F K 1 E = K2^{T}FK1 E=K2TFK1
F = K 2 − T E k 1 − 1 F = K2^{-T}Ek1^{-1} F=K2TEk11
基础矩阵描述的是图像坐标之间的关系,而本质矩阵描述的是在相机坐标系中的几何关系。

本质矩阵的秩为 2,即它的特征值中有一个为零。它是一个 3×3 的矩阵,可以表示为如下形式:
E = [ t ] ✖ R E = [t]✖R E=[t]R

  • R是相机之间的旋转矩阵
  • [ t ] ✖ [t]✖ [t]是平移向量t对应的反对称矩阵(3×3)
    (在线性代数中,反对称矩阵(或称斜对称矩阵)指转置矩阵和自身的加法逆元相等的方形矩阵 A T = − A A^{T} = -A AT=A
    本质矩阵的计算
  • 从点对获取本质矩阵
    如果我们已经知道了图像中的对应点对 {x1,x2},可以通过八点法等方法来估计本质矩阵。通过这些方法,我们可以得到一个包含旋转和平移信息的本质矩阵。
  • 相机标定
    E = K 2 T F K 1 E = K2^{T}FK1 E=K2TFK1
SVD分解矩阵

给定一个m*n的矩阵A,奇异值分解将其表示为三个矩阵的乘积:
A = U Σ V T A = UΣV^{T} A=UΣVT

  • U 是一个 m×m 的正交矩阵,包含矩阵 A 的左奇异向量
  • Σ是一个 m×n 的对角矩阵,包含矩阵 A 的奇异值。奇异值是矩阵 A 的特征值的平方根,并且按降序排列。
  • V T V^{T} VT 是一个 n×n 的正交矩阵,包含矩阵 A 的右奇异向量。
    左奇异向量:矩阵 A 的左奇异向量是矩阵 U 中的列向量,记为 u1,u2,…,ur ,这些向量是 A T A A^{T}A ATA 的特征向量
    右奇异向量:矩阵 A 的右奇异向量是矩阵 U 中的列向量,记为 u1,u2,…,ur ,这些向量是 A A T AA^{T} AAT 的特征向量
    SVD计算:Jacobi算法、Golub-Kahan算法
    现代计算软件(如 NumPy、MATLAB)通过高效的数值算法实现了 SVD 的快速计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ELK-ELK基本概念_ElasticSearch的配置

文章目录 一、什么是ELK&#xff1f;有什么用&#xff1f;ELK是什么&#xff1f;ElasticsearchLogstashKibana ELK的作用 二、ElasticSearch的安装与基本配置为何需要依赖JDK&#xff1f;使用yum install java-11-openjdk和使用Oracle官网提供的jdk的rpm包安装JDK的区别 参考资…

怎么查看navicat的数据库密码

步骤1:打开navicat连接数据库工具&#xff0c;顶部的文件栏-导出结果-勾选导出密码-导出 步骤2&#xff1a;导出结果使用NotePad或文本打开&#xff0c;找到&#xff0c;数据库对应的的Password"995E66F64A15F6776“”的值复制下来 <Connection ConnectionName"…

linux驱动-i2c子系统框架学习(1)

可以将整个 I2C 子系统用下面的框图来描述&#xff1a; 可以将上面这一 I2C 子系统划分为三个层次&#xff0c;分别为用户空间、内核空间和硬件层&#xff0c;内核空间就包括 I2C 设备驱动层、I2C 核心层和 I2C 适配器驱动层&#xff0c; 本篇主要内容就是介绍 I2C 子系统框架中…

基于SSM的企业管理系统(源码+lw+调试+技术指导)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

【金融风控】相关业务介绍及代码详解

金融风控相关业务介绍 【了解】项目整体介绍 1.风控业务和风控报表</span> 零售金融产品 相关的指标 风控建模流程 ​ #2.特征工程 特征构造 特征筛选 ​ 3.评分卡模型构建 逻辑回归 集成学习 XGBoost LightGBM 模型评估 ​ #4.样本不均衡问题/异常点检测 【了解】今日…

【LeetCode】【算法】647. 回文子串

LeetCode 647.回文子串 题目描述 给你一个字符串s&#xff0c;请你统计并返回这个字符串中回文子串的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串是字符串中的由连续字符组成的一个序列。 思路 思路&#xff1a;中心拓展法 中心拓展法的意思是说&#xf…

Late Chunking×Milvus:如何提高RAG准确率

01. 背景 在RAG应用开发中&#xff0c;第一步就是对于文档进行chunking&#xff08;分块&#xff09;&#xff0c;高效的文档分块&#xff0c;可以有效的提高后续的召回内容的准确性。而对于如何高效的分块是个讨论的热点&#xff0c;有诸如固定大小分块&#xff0c;随机大小分…

华为机试HJ26 字符串排序

首先看一下题 描述 编写一个程序&#xff0c;将输入字符串中的字符按如下规则排序。 规则 1 &#xff1a;英文字母从 A 到 Z 排列&#xff0c;不区分大小写。 如&#xff0c;输入&#xff1a; Type 输出&#xff1a; epTy 规则 2 &#xff1a;同一个英文字母的大小写同时存在时…

学习正则表达式,如何校验手机号与电子邮箱

文章目录 一、正则表达式基础知识1.特殊字符&#xff08;Metacharacters&#xff09;2.字符类&#xff08;Character Classes&#xff09;3.预定义字符集&#xff08;Predefined character classes&#xff09;4.分组&#xff08;Groups&#xff09;5.量词&#xff08;Quantifi…

[QUIC] QUIC Frames

PADDING PADDING Frame {Type (i) = 0x00, }这个帧用于增加 QUIC 包的大小。 对于 Initial 包, 可以用它来增加包大小以达到要求的最小包的大小限制。 填充 QUIC 包以对抗流量分析。 这个帧的大小为1字节,表明自己是一个 PADDING 帧。 PING PING Frame {Type (i) = 0x01, …

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d&#xff1a;如果是两位数&#xff0c;将会在前面添上一位0 %.2f&#xff1a;会保留两位小数 如果是long&#xff0c;必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制&#xff1a; 十进制转任意进制时&#xff…

责任链模式 Chain of Responsibility

1 意图 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 2 结构 Handler 定义一个处理请求的接口;(可选)实现后继链。 ConcreteHandler …

设计模式小结一工厂模式

先上结论: 工厂模式,也是一个开发者必须要掌握的设计模式。笔者记得大学里编程接触到的第一个设计模式就是工厂模式,现在回过头来看,那时接触的应该叫简单工厂模式,工厂模式还包括:工厂方法模式、抽象工厂模式。 开干! 老规矩,先上理论: 工厂模式(Factory Pattern…

SQL Server 2008 R2 详细安装教程及错误解决教程

SQL Server 2008 R2 详细安装教程及错误解决教程 文章目录 SQL Server 2008 R2 详细安装教程及错误解决教程1.装载或解压ISO文件2. 运行setup程序3. 下载并安装.NET Framework3.54.选择全新安装或向现有安装添加功能5.输入秘钥同意条款6.选择安装类型7.设置角色8.功能选择9.实例…

国际版JAVA同城打车源码同城服务线下结账系统源码适配PAD支持Android+IOS+H5

架构分析 导航栏&#xff1a;位于界面上方&#xff0c;包含了“数据中心”、“消息”、“用户中心”等主要功能模块的入口&#xff0c;方便用户快速访问。左侧功能模块&#xff1a;在界面的左侧&#xff0c;以列表形式展示了多个功能模块&#xff0c;如“数据中心”、“消息中…

营销页面设计:精准触达目标群体的艺术

在当今数字化的商业世界中&#xff0c;营销页面设计扮演着至关重要的角色。成功的营销页面设计不仅仅是美观那么简单&#xff0c;它需要结合场景设计、精准定位目标群体、巧妙运用设计元素以及精心策划的色彩搭配&#xff0c;共同编织出一张引人入胜的视觉网络。 今天就以洋河…

【spark面试题】RDD和DataFrame以及DataSet有什么异同

RDD&#xff08;Resilient Distributed Dataset&#xff09;&#xff1a; 概念&#xff1a;可理解为分布式的列表。它的每个元素代表数据的一行&#xff0c;具有支持泛型这一显著特点。这种泛型支持让开发人员能够处理各种类型的数据&#xff0c;具有很强的灵活性。例如&#…

gdb和make工具

gdb工具&#xff1a; GDB的主要功能 断点设置&#xff1a;允许开发者在特定的代码行设置断点&#xff0c;当程序执行到该行时会自动暂停&#xff0c;方便开发者进行调试和分析。 变量查看与修改&#xff1a;在程序运行过程中&#xff0c;可以查看和修改变量的值&#xff0c;以…

Java实现图片转pdf

该方法可以选择多个图片是否合并为一个pdf输出&#xff0c;也可以选择图片为横向或者纵向输出&#xff0c;也可以选择pdf页面为A3或者A4 第一步 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version…

爬虫-------字体反爬

目录 一、了解什么是字体加密 二. 定位字体位置 三. python处理字体 1. 工具库 2. 字体读取 3. 处理字体 案例1:起点 案例2:字符偏移: 5请求数据 - 发现偏移量 5.4 多套字体替换 套用模板 版本1 版本2 四.项目实战 1. 采集目标 2. 逆向结果 一、了解什么是…