【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.hqwc.cn/news/618746.html

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

相关文章

解决 php 连接mysql数据库时报错:Fatal error: Class ‘mysqli’ not found in问题

如果你没找到php.ini但只有php.ini-development或者php.ini-production。 首先先创建一个php.ini然后复制php.ini-development或者php.ini-production到里面去。 然后在php.ini里面进行操作。一共两步。 第一步&#xff0c;将extension前面的分号去掉 第二步&#xff0c;更换为…

AutoGen - Build Powerful AI Agents with ChatGPT/GPT-4

原文:AutoGen - Build Powerful AI Agents with ChatGPT/GPT-4 | MLExpert - Crush Your Machine Learning interview In this tutorial, well explore AutoGen1, a Microsoft library that lets you create LLM applications with agents. These agents can communicate and …

基于Docker构建CI/CD工具链(六)使用Apifox进行自动化测试

添加测试接口 在Spring Boot Demo项目里实现一个简单的用户管理系统的后端功能。具体需求如下&#xff1a; 实现了一个RESTful API&#xff0c;提供了以下两个接口 &#xff1a; POST请求 /users&#xff1a;用于创建新的用户。GET请求 /users&#xff1a;用于获取所有用户的列…

ChatGPT在线网页版

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

YOLTV8 — 大尺度图像目标检测框架(欢迎star)

YOLTV8 — 大尺度图像目标检测框架【ABCnutter/YOLTV8: &#x1f680;】 针对大尺度图像&#xff08;如遥感影像、大尺度工业检测图像等&#xff09;&#xff0c;由于设备的限制&#xff0c;无法利用图像直接进行模型训练。将图像裁剪至小尺度进行训练&#xff0c;再将训练结果…

Matlab隐式方程拟合【案例源码+视频教程】|隐函数拟合|非线性拟合|视频教程

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

OpenHarmony实战开发-Actor并发模型对比内存共享并发模型

内存共享并发模型指多线程同时执行复数任务&#xff0c;这些线程依赖同一内存并且都有权限访问&#xff0c;线程访问内存前需要抢占并锁定内存的使用权&#xff0c;没有抢占到内存的线程需要等待其他线程释放使用权再执行。 Actor并发模型每一个线程都是一个独立Actor&#xf…

synchronized底层原理

1synchronized关键字的底层原理 Monitor 举个例子&#xff1a; 1.线程1执行synchronized代码块&#xff0c;里面用到了lock(对象锁)。首先会让这个lock对象和monitor关联&#xff0c;判断monitor中的owner属性是否为null。如果为null直接获取对象锁。owner只能关联一个线程。 2…

机器学习和深度学习--李宏毅 (笔记与个人理解)Day 16

Day 16 deep Learning – 鱼与熊掌兼得 最近在减重&#xff0c; 昨天跑了个一公里&#xff0c;然后今天上午又打了个篮球&#xff0c;真是老胳膊老腿了&#xff0c;运动完给我困得不行 Review 见前面的笔记 这里说dl 会提供一个足够大的模型&#xff0c; 来使得Dall loss 足够小…

ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现

摘 要 通过搜索引擎从互联网上获取有用信息已经成为人们生活的重要组成部分&#xff0c;Lucene是构建搜索引擎的其中一种方式。搜索引擎系统是在.Net平台上用C#开发的&#xff0c;数据库是MSSQL Server 2000。主要完成的功能有&#xff1a;用爬虫抓取网页&#xff1b;获取有效…

java:特殊文件(properties,xml)和日志

特殊文件 txt(文本文件) txt文件是一种纯文本文件,用于存储文本信息 优缺点:txt文件简单易用,可以使用任何文本编辑器打开和编辑,但不支持数据类型和结构,所有信息均用纯文本形式保存 适合简单的配置信息存储 properties文件 properties文件是一种键值对文件,用于存储配置…

【Linux】账号和权限管理

目录 一、用户账号与组账号 二、添加用户账号-useradd 三、修改用户账号的属性-usermod 四、更改用户命令-passwd 五、删除用户账号-userdel 六、添加组账号-groupadd 七、添加删除组成员-gpasswd 八、删除组账号-groupdel 九、查询账号信息-groups、id、finger、w、w…