【opencv】示例-stiching.cpp 图像拼接

6fb08b1e3eb386d07ba4e1fc133eac32.png

0f0f2ff1322e5adca651c5c0fdf51a31.png

#include "opencv2/imgcodecs.hpp" // 导入opencv图像编码功能库
#include "opencv2/highgui.hpp"   // 导入opencv高层用户界面功能库
#include "opencv2/stitching.hpp" // 导入opencv图像拼接功能库#include <iostream> // 导入输入输出流库using namespace std;  // 使用std命名空间,便于使用这个命名空间下的功能
using namespace cv;   // 使用cv(opencv)命名空间bool divide_images = false; // 默认不将图像分块处理的标志位
Stitcher::Mode mode = Stitcher::PANORAMA; // 默认拼接模式为全景模式
vector<Mat> imgs; // 存储所有图像的向量
string result_name = "result.jpg"; // 默认输出图像的文件名void printUsage(char** argv); // 函数声明,打印程序用法信息
int parseCmdArgs(int argc, char** argv); // 函数声明,解析命令行参数// 主函数
int main(int argc, char* argv[])
{int retval = parseCmdArgs(argc, argv); // 解析命令行参数if (retval) return EXIT_FAILURE; // 如果参数有误,返回失败//![stitching]Mat pano; // 用于存储拼接完的图像Ptr<Stitcher> stitcher = Stitcher::create(mode); // 创建拼接器实例,传入模式Stitcher::Status status = stitcher->stitch(imgs, pano); // 进行拼接并返回状态if (status != Stitcher::OK) // 如果状态不是OK,即拼接失败{cout << "Can't stitch images, error code = " << int(status) << endl; // 输出错误信息return EXIT_FAILURE; // 返回失败}//![stitching]imwrite(result_name, pano); // 写入拼接完成的图像cout << "stitching completed successfully\n" << result_name << " saved!"; // 输出成功信息return EXIT_SUCCESS; // 返回成功
}// 打印程序用法信息的函数
void printUsage(char** argv)
{cout<< "Images stitcher.\n\n" << "Usage :\n" << argv[0] <<" [Flags] img1 img2 [...imgN]\n\n"<< "Flags:\n"<< "  --d3\n"<< "      internally creates three chunks of each image to increase stitching success\n"<< "  --mode (panorama|scans)\n"<< "      Determines configuration of stitcher. The default is 'panorama',\n"<< "      mode suitable for creating photo panoramas. Option 'scans' is suitable\n"<< "      for stitching materials under affine transformation, such as scans.\n"<< "  --output <result_img>\n"<< "      The default is 'result.jpg'.\n\n"<< "Example usage :\n" << argv[0] << " --d3 --mode scans img1.jpg img2.jpg\n";
}// 解析命令行参数的函数
int parseCmdArgs(int argc, char** argv)
{if (argc == 1) // 如果参数只有一个,即没有指定输入图片{printUsage(argv); // 打印程序用法信息return EXIT_FAILURE; // 返回失败}for (int i = 1; i < argc; ++i) // 遍历参数{if (string(argv[i]) == "--help" || string(argv[i]) == "/?"){printUsage(argv); // 如果是帮助标志,打印程序用法信息return EXIT_FAILURE; // 返回失败}else if (string(argv[i]) == "--d3"){divide_images = true; // 如果设置了分块标志,修改分块处理标志位为真}else if (string(argv[i]) == "--output"){result_name = argv[i + 1]; // 设置输出文件名i++; // 跳过下一个参数(输出文件名)}else if (string(argv[i]) == "--mode"){if (string(argv[i + 1]) == "panorama")mode = Stitcher::PANORAMA; // 设置模式为全景else if (string(argv[i + 1]) == "scans")mode = Stitcher::SCANS; // 设置模式为扫描else{cout << "Bad --mode flag value\n"; // 如果模式设置错误,输出错误信息return EXIT_FAILURE; // 返回失败}i++; // 跳过下一个参数(模式)}else{Mat img = imread(samples::findFile(argv[i])); // 读取图像if (img.empty()) // 如果读取失败{cout << "Can't read image '" << argv[i] << "'\n"; // 输出错误信息return EXIT_FAILURE; // 返回失败}if (divide_images) // 如果设置了分块处理标志{Rect rect(0, 0, img.cols / 2, img.rows); // 计算第一块的位置imgs.push_back(img(rect).clone()); // 把第一块图像加入向量rect.x = img.cols / 3; // 计算第二块的位置imgs.push_back(img(rect).clone()); // 把第二块图像加入向量rect.x = img.cols / 2; // 计算第三块的位置imgs.push_back(img(rect).clone()); // 把第三块图像加入向量}elseimgs.push_back(img); // 如果没有分块处理,直接加入图像}}return EXIT_SUCCESS; // 返回成功
}

此代码用于实现图像的拼接处理,使用了OpenCV库来加载、处理和保存图像。主要功能包括解析命令行参数以获得用户输入的图像文件和其他选项,创建一个拼接器来对图像进行拼接,并根据拼接结果保存为一个文件。用户可以通过特定的标志来影响拼接的模式或增加拼接成功率(例如,通过分块处理)。

./test --d3 --mode scans lena.jpgstitching completed successfully
result.jpg saved!

035388a37747c6bcade9d2c957f4c78b.jpeg

lena.jpg

1992da993ca6b4c7e5c619aacf7c9416.jpeg

result.jpg    scan拼接有误

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

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

相关文章

PyQt5

Qt是基于C实现的GUI,而PyQt就是用python调用Qt. PyQt中有很多的功能模块,开发最常用的模块功能主要有3个 1) QtCore:包含核心的非GHI的功能,主要和时间,文件与文件夹,各种数据,流,URLs,进程与线程一起使用 2) QtGUi:包含窗口系统,事件处理,2D图像,基本绘画,字体和文字类 3)…

详解构造函数

前言 希望这篇文章是有意义的&#xff0c;能够帮助初学者理清构造函数的概念&#xff0c;关系及误区。首先定义一个日期类&#xff0c;借助日期类讲解构造函数。 class Date {public:void Init(int year, int month, int day) //初始化数据的方法{_year year;_month month…

Ubuntu快捷安装MySQL

更新包列表 sudo apt update 安装mysql sudo apt install mysql-server 启动mysql // 启动mysql sudo service mysql start// 关闭mysql sudo service mysql stop// 重启mysql sudo service mysql restart 连接mysql // 初始安装无密码&#xff0c;直接连接即可&#xf…

【opencv】示例-train_HOG.cpp 训练和测试基于支持向量机(SVM)的行人检测器

#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理头文件 #include "opencv2/highgui.hpp" // 包含OpenCV高层GUI&#xff08;图形用户界面&#xff09;头文件 #include "opencv2/ml.hpp" // 包含OpenCV机器学习模块头文件 #includ…

数据结构初阶:二叉树(二)

二叉树链式结构的实现 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在对二叉树结构掌握还不够深入&#xff0c;为了降低学习成本&#xff0c;此处手动快速创建一棵简单的二叉树&#xff0c;快速进入二…

二、Flask会话技术和模板语言

Cookie Session # views.py: 路由 视图函数 import datetimefrom flask import Blueprint, render_template, request, redirect, session from .models import *# 蓝图 blue Blueprint(user, __name__)# 首页 可以写两个路由&#xff0c;都是访问同一个函数 blue.route(/) b…

【数据结构】泛型(分享重点)

什么是泛型&#xff1f; 泛型就是适用于许多许多类型&#xff0c;对类型参数化。 怎么创建一个泛型呢 class 泛型类名称<类型形参列表> { // 这里可以使用类型参数 } class ClassName<T1, T2, ..., Tn> { } class 泛型类名称<类型形参列表> extends 继承类…

微服务之LoadBalancer负载均衡服务调用

一、概述 1.1什么是负载均衡 LB&#xff0c;既负载均衡&#xff08;Load Balancer&#xff09;,是高并发、高可用系统必不可少的关键组件&#xff0c;其目标是尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 负载均衡的主要作用 高并发…

回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于RIME-SVR霜冰算法优化支持向量机的数…

MySQL优化慢SQL的6种方式

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《mysql经验总结》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 优化思路 优化方法 1.避免查询不必要的列 2.分页优化 3.索引优化 4.JOIN优化 5.排序优化 6.UNION 优化…

无线网络2.4和5G的区别

无线网络2.4和5的区别 无线网络2.4GHz和5GHz的主要区别在于频率、覆盖范围、传输速度、干扰能力和穿透性。以下是详细介绍&#xff1a;12 频率不同。2.4GHz的频率较低&#xff0c;而5GHz的频率较高。频率越低&#xff0c;信号在传播过程中的损失越小&#xff0c;因此覆盖范围…

linux学习:文件属性

在操作文件的时候&#xff0c;经常需要获取文件的属性&#xff0c;比如类型、权限、大小、所有者等等&#xff0c; 这些信息对于比如文件的传输、管理等是必不可少的&#xff0c;而这些信息 这三个函数的功能完全一样&#xff0c;区别是&#xff1a;stat( )参数是一个文件的名字…

网络篇05 | 应用层 http/https

网络篇05 | 应用层 http/https 01 HTTP请求报文协议&#xff08;Request&#xff09;1&#xff09;Request简述2&#xff09;请求行&#xff08;首行&#xff09;3&#xff09;请求头&#xff08;Request Headers&#xff09;4&#xff09;空行5&#xff09;正文&#xff08;Re…

【机器学习300问】67、均方误差与交叉熵误差,两种损失函数的区别?

一、均方误差&#xff08;Mean Squared Error, MSE&#xff09; 假设你是一个教练&#xff0c;在指导学生射箭。每次射箭后&#xff0c;你可以测量子弹的落点距离靶心的差距&#xff08;误差&#xff09;。MSE就像是计算所以射击误差的平方后的平均值。它强调了每一次偏离靶心的…

ARM v8 Cortex R52内核 04 时钟和复位 Clocking and Resets

ARM v8 Cortex R52内核 04 时钟和复位 Clocking and Resets 4.1 Clock and clock enables 时钟和时钟使能 Cortex-R52处理器具有一个单一的时钟&#xff0c;驱动着所有的触发器和RAM。各种输入&#xff0c;包括复位输入&#xff0c;都有同步逻辑使它们可以与处理器时钟异步操…

如何在MacOS上使用OpenHarmony SDK交叉编译?

本文以cJSON三方库为例介绍如何通过OpenHarmony的SDK在Mac平台进行交叉编译。 环境准备 SDK准备 我们可以通过 openHarmony SDK 官方发布渠道下载对应mac版本的SDK&#xff0c;当前OpenHarmony MAC版本的SDK有2种&#xff0c;一种是x86架构&#xff0c;另一种是arm64&#x…

做一个后台项目的架构

后台架构的11个维度 架构1&#xff1a;团队协助基础工具链的选型和培训架构2&#xff1a;搭建微服务开发基础设施架构3&#xff1a;选择合适的RPC框架架构4&#xff1a;选择和搭建高可用的注册中心架构5&#xff1a;选择和搭建高可用的配置中心架构6&#xff1a;选择和搭建高性…

Hudi-ubuntu环境搭建

hudi-ubuntu环境搭建 运行 1.编译Hudi #1.把maven安装包上传到服务器 # 官网下载安装包 https://archive.apache.org/dist/maven/maven-3/ scp -r D:\Users\zh\Desktop\Hudi\compressedPackage\apache-maven-3.6.3-bin.tar.gz zhangheng10.8.4.212:/home/zhangheng/hudi/com…

Spring+SpringMVC的知识总结

一:技术体系架构二:SpringFramework介绍三:Spring loC容器和核心概念3.1 组件和组件管理的概念3.1.1什么是组件:3.1.2:我们的期待3.1.3Spring充当组件管理角色(IOC)3.1.4 Spring优势3.2 Spring Ioc容器和容器实现3.2.1普通和复杂容器3.2.2 SpringIOC的容器介绍3.2.3 Spring IOC…

字符串常量池(StringTable)

目录 String的基本特性 String的内存分配 字符串拼接操作 intern()的使用 String的基本特性 String&#xff1a;字符串&#xff0c;使用一对""引起来表示 String声明为final的&#xff0c;不可被继承 String实现了Serializable接口&#xff1a;表示字符串是支持…