| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 图像拼接小实验开发日志和笔记 -> 正文阅读 |
|
[人工智能]图像拼接小实验开发日志和笔记 |
图像拼接小实验开发日志和笔记b y ? t i a n . z ? D e c by \ tian.z \ Dec by?tian.z?Dec - 2021 2021 2021
1. 技术路线参考了文献1 1.1. 开发环境系统 Ubuntu 20.04 1.2. 图像配准
从计算速度、实现难度和课程内容结合的方面综合考虑,本设计采用基于特征点的匹配方法。 1.2.1. 特征提取对比主流的特征点提取方法,SIFT4 计算量较大,SURF5 作为SIFT的改进提升了运算速度。而ORB6特征主要面对实时性较强的系统设计牺牲了部分精度。综合考虑本设计提取SRUF特征。 1.2.2. 特征匹配特征匹配时,若使用暴力匹配不但需要很大的计算量,并且还存在大量的误匹配,效果较差。 1.2.3. 图像变换本设计假设两张图片的特征点落在同一平面上,这样则可以通过单应性进行匹配分析。 1.3. 图像合成对于图像重叠区域,直接加权平滑算法处理拼接缝 P i x e l = α × P i x e l L + ( 1 ? α ) × P i x e l R Pixel=\alpha×Pixel_L+(1-\alpha)× Pixel_R Pixel=α×PixelL?+(1?α)×PixelR? 1.4. 扩展性思考
2. 具体实现与调试问题2.1. 总体架构项目地址:https://gitee.com/ztztt/simple-image-mosaic
计划先在master分支基于opencv的算法库把功能实现,如果后面有时间和兴趣,在develop分支把个别算法手写实现一下. 2.2. opencv读取图像小知识,为什么我们都用’opencv2’而不是‘opencv3’呢,因为这个2不是版本号,而是基于C++写成的意思,最初opencv是用C写的.来源 刚一上手编译就报错,提示
似乎是opencv没有链接进来,仔细检查,发现在src文件夹中的CMakeLists文件里这一行写错了:
应该写成
run是输出的可执行文件
再次编译,问题解决 在显示图像的时候别忘了加上 2.3. CMake链接glog在CMakeList
后面还要加上
才能正确链接到glog,否则编译器会报错
2.4. 调用opencv的surf实现
显然是没有nonfree这个库,网上给出的解决方案普遍是
但我陷入了无尽的递归debug,最终我的大脑栈溢出了。网络上有好哥哥指出安装opencv-contrib库即可。
已经不适用了,缅怀. 实际运行的时候,报错
提示我们算法受版权保护,让我们改cmakelists里面一个选项,找到它,吧最后的参数
还是不行.
cmake结束后,可以看见提示 :
最后一行告诉我们nonfree的算法已经可以用了,感谢网络上的好哥哥. 2.5. CMake编译多个.cpp文件笔者第一次实际进行含有多个文件的项目开发,在此记录一下遇到的问题.
这样两个文件就关联起来了.注意,包含 这时直接编译不会通过,还要在src/下的MakeLists中加入:
编译通过,程序运行正常. 2.6. cv::DMatch结构
DMatch结构体中包含了同一关键点在两张图片中的索引,可以用迭代器和原始关键点的cv::keyPoint类进行访问,写出来非常优雅. 2.7. cv::Mat类的拷贝这里坑了我好长时间 浅拷贝
这类拷贝方法仅创建了新的矩阵头,共用同一个内存空间,在修改新对象的时候,旧对象也会改变。 深拷贝
这类拷贝方法为新的矩阵申请了新的内存空间,在修改新对象的时候,旧对象不会改变。 3. 理论3.1. SURF特征LiangYP3.2. FLANN快速最近邻搜索ZhaoBFLANN是一个在高维空间内快速最近邻域搜索的算法库,它包含了对于最近邻搜索效果最好的一些算法,和一个能够自动根据数据集选取最优的算法和参数的系统。FLANN基于C++写成并提供C,MATLAB,Python和Ruby的接口。翻译自项目Github地址。 文献8中,介绍了FLANN中使用的算法,包括随机kd树算法、优先搜索k-means树算法等 3.3. RANSAC随机一致性采样LiCKRANSAC9 是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果;为了提高概率必须提高迭代次数。 3.4. 单应矩阵Homography与射影变换单应(Homography)是射影几何中的概念,又称为射影变换。它把一个射影平面上的点(三维齐次矢量)映射到另一个射影平面上,并且把直线映射为直线,具有保线性质。总的来说,单应是关于三维齐次矢量的一种线性变换,可以用一个
3
×
3
3×3
3×3的非奇异矩阵
H
H
H表示 这是一个齐次坐标的等式,
H
H
H乘以一个非零的比例因子上述等式仍然成立,即
H
H
H是一个
3
×
3
3×3
3×3齐次矩阵,具有8个未知量。 其中, ( u 1 , v 1 , 1 ) T (u_1,v_1,1)^T (u1?,v1?,1)T表示图像1中的像点 ( u 2 , v 2 , 1 ) T (u_2,v_2,1)^T (u2?,v2?,1)T是图像2中的像点,也就是可以通过单应矩阵 H H H将图像2变换到图像1。这有了很多实际的应用,例如图像的校正、对齐以及在SLAM中估计两个相机间的运动。 单应矩阵定义为 由尺度、相机内参、外参相乘。两个旋转,一个平移,一个尺度,共四个自由度,理论上四个约束可解。 但实际应用中,匹配的特征点往往会远多于四对。这时就可以构建一个过约束的方程组,把问题转换为一个最小二乘的优化问题。 4. 参考文献
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 23:30:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |