【opencv】教程代码 —features2D(5)旋转相机的基本全景拼接

2024-03-31 08:44

本文主要是介绍【opencv】教程代码 —features2D(5)旋转相机的基本全景拼接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

b630e920a95ed92ad6d01ecc7080cc84.png

c60f6b22c247e79b4a18c7df5b57965a.png

05e0c430515a7c35a2d038bc89e0217d.png

基本全景拼接

panorama_stitching_rotating_camera.cpp 将第二张图像进行透视变换后与第一张图像拼接

4f0c4c179bfe2fca60ea95ab50692254.png

#include <iostream>  // 包含了一些用于输入输出的函数
#include <opencv2/core.hpp>  // 包含了OpenCV核心库的一些常用类和函数
#include <opencv2/imgproc.hpp>  // 包含了图像处理的一些类和函数,如图像直方图、滤波、颜色变换等
#include <opencv2/highgui.hpp>  // 包含了GUI绘制函数和一些文件输入输出函数与图片展示函数。using namespace std;  // 使用标准库命名空间
using namespace cv;  // 使用OpenCV库命名空间namespace  // 匿名命名空间
{
void basicPanoramaStitching(const string &img1Path, const string &img2Path)  // 定义一个基本全景图拼接的函数
{Mat img1 = imread( samples::findFile( img1Path ) );  // 读取第一张图片,并进行文件路径查找Mat img2 = imread( samples::findFile( img2Path ) );  // 读取第二张图片,并进行文件路径查找// 定义第一张图片的摄像头位置信息Mat c1Mo = (Mat_<double>(4,4) << 0.9659258723258972, 0.2588190734386444, 0.0, 1.5529145002365112,0.08852133899927139, -0.3303661346435547, -0.9396926164627075, -0.10281121730804443,-0.24321036040782928, 0.9076734185218811, -0.342020183801651, 6.130080699920654,0, 0, 0, 1);// 定义第二张图片的摄像头位置信息Mat c2Mo = (Mat_<double>(4,4) << 0.9659258723258972, -0.2588190734386444, 0.0, -1.5529145002365112,-0.08852133899927139, -0.3303661346435547, -0.9396926164627075, -0.10281121730804443,0.24321036040782928, 0.9076734185218811, -0.342020183801651, 6.130080699920654,0, 0, 0, 1);// 定义相机的内参信息Mat cameraMatrix = (Mat_<double>(3,3) << 700.0, 0.0, 320.0,0.0, 700.0, 240.0,0, 0, 1);// 提取旋转矩阵Mat R1 = c1Mo(Range(0,3), Range(0,3));Mat R2 = c2Mo(Range(0,3), Range(0,3));// 计算旋转位移Mat R_2to1 = R1*R2.t();// 计算单应性矩阵Mat H = cameraMatrix * R_2to1 * cameraMatrix.inv();H /= H.at<double>(2,2);cout << "H:\n" << H << endl;// 进行全景图像拼接Mat img_stitch;warpPerspective(img2, img_stitch, H, Size(img2.cols*2, img2.rows));imshow("warp_image2", img_stitch);// 中间输出Mat half = img_stitch(Rect(0, 0, img1.cols, img1.rows));img1.copyTo(half);// 显示经过拼接的全景图像和原图对比Mat img_compare;Mat img_space = Mat::zeros(Size(50, img1.rows), CV_8UC3);hconcat(img1, img_space, img_compare);hconcat(img_compare, img2, img_compare);imshow("Compare images", img_compare);imshow("Panorama stitching", img_stitch);  // 显示拼接的全景图waitKey();  // 等待用户响应
}// 参数描述信息
const char* params= "{ help h   |                      | print usage }""{ image1   | Blender_Suzanne1.jpg | path to the first Blender image }""{ image2   | Blender_Suzanne2.jpg | path to the second Blender image }";
}int main(int argc, char *argv[])  // 主函数,程序从此处开始运行
{CommandLineParser parser(argc, argv, params);  // 命令行参数解析器if (parser.has("help"))  // 如果有输入'help'参数{parser.about( "Code for homography tutorial.\n""Example 5: basic panorama stitching from a rotating camera.\n" );  // 显示关于该程序的简介parser.printMessage();  // 打印所有参数的说明return 0;  // 程序正常退出}basicPanoramaStitching(parser.get<String>("image1"), parser.get<String>("image2"));  // 运行全景图像拼接函数return 0;  // 程序正常退出
}

这段代码是使用OpenCV来实现全景图像拼接的一个基础示例,通过计算两张來自同一旋转摄像头拍摄的图像的单应性矩阵,然后将第二张图像进行透视变换后与第一张图像拼接,得到一张全景图。

541d734d81ec8992977cc3332299227c.png

这篇关于【opencv】教程代码 —features2D(5)旋转相机的基本全景拼接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863919

相关文章

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部