OpenCV杂记(2):图像拼接(hconcat, vconcat)

2024-04-20 06:36

本文主要是介绍OpenCV杂记(2):图像拼接(hconcat, vconcat),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OpenCV杂记(1):绘制OSD(cv::getTextSize, cv::putText)icon-default.png?t=N7T8https://blog.csdn.net/tecsai/article/details/137872058

 

1. 简述

        做图像处理或计算机视觉技术的同学都知道,我们在工作中会经常遇到需要将两幅图像拼接成为一幅图像,或者将四幅图像拼接成为一个2*2马赛克图像的需求。

        OpenCV提供了多种图像拼接的API,包括水平拼接cv:hconcat,垂直拼接cv::vconcat。此外,还可以通过创建一张大图,然后使用copyTo接口将小图像依次覆盖的形式进行拼接。

        假设我们有四张图,我们想对他们执行垂直拼接、水平拼接以及Mosaic拼接,接下来我们将依次进行讲解。

2. API原型

(1)垂直拼接

void cv::vconcat(InputArray src1, InputArray src2, OutoutArray dst)

该API接口接收两幅图像src1和src2,输出经过拼接后的图像dst。

cv::vconcat还有另外一个接口,接收多张图像进行垂直拼接。

void cv::vconcat(const Mat* src, size_t nsrc, OutputArray dst);

此处的src是一个Mat列表。

(2)水平拼接

void cv::hconcat(InputArray src1, InputArray src2, OutoutArray dst)

void cv::hconcat(const Mat* src, size_t nsrc, OutputArray dst)

3. 垂直拼接

OpenCV提供了快速垂直拼接接口cv::vconcat,该接口接受两个宽度相同的子图像进行拼接,拼接后的高度是两幅子图像的高度和。

如下代码演示了如何调用cv::vconcat进行图像拼接操作。

#include <iostream>#include <sstream>#include <fstream>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>    #include <opencv2/imgproc/types_c.h>#include <opencv2/highgui/highgui.hpp>#include <opencv2/highgui/highgui_c.h>using namespace std;int main(int argc, char* argv[]){cv::Mat img_0 = cv::imread("000001.jpg", cv::IMREAD_UNCHANGED);cv::Mat img_1 = cv::imread("000002.jpg", cv::IMREAD_UNCHANGED);cv::Mat img_2 = cv::imread("000003.jpg", cv::IMREAD_UNCHANGED);cv::Mat img_3 = cv::imread("000004.jpg", cv::IMREAD_UNCHANGED);if (img_0.empty() || img_1.empty() || img_2.empty() || img_3.empty()){cout << "Error: Could not load image." << endl;return 0;}/** 图像竖向拼接. */cv::Mat vconcat_mat_0;cv::vconcat(img_0, img_1, vconcat_mat_0);std::cout << "img_0.size: (" << img_0.cols << ", " << img_0.rows << ")" << std::endl;std::cout << "img_1.size: (" << img_1.cols << ", " << img_1.rows << ")" << std::endl;std::cout << "vconcat_mat_0.size: (" << vconcat_mat_0.cols << ", " << vconcat_mat_0.rows << ")" << std::endl;cv::imwrite("./vconcat_mat_0.jpg", vconcat_mat_0);/*** img_0.size: (1920, 1080)* img_1.size: (1920, 1080)* vconcat_mat_0.size: (1920, 2160)*/return 0;}

经过垂直拼接后的图像如下。

4. 水平拼接

水平拼接接收两幅高度相同的子图像,拼接后的图像宽度等于两幅子图像的宽度和。

#include <iostream>#include <sstream>#include <fstream>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>    #include <opencv2/imgproc/types_c.h>#include <opencv2/highgui/highgui.hpp>#include <opencv2/highgui/highgui_c.h>using namespace std;int main(int argc, char* argv[]){cv::Mat img_0 = cv::imread("000001.jpg", cv::IMREAD_UNCHANGED);cv::Mat img_1 = cv::imread("000002.jpg", cv::IMREAD_UNCHANGED);cv::Mat img_2 = cv::imread("000003.jpg", cv::IMREAD_UNCHANGED);cv::Mat img_3 = cv::imread("000004.jpg", cv::IMREAD_UNCHANGED);if (img_0.empty() || img_1.empty() || img_2.empty() || img_3.empty()){cout << "Error: Could not load image." << endl;return 0;}/** 图像横向拼接. */cv::Mat hconcat_mat_0;cv::hconcat(img_2, img_3, hconcat_mat_0);std::cout << "img_2.size: (" << img_2.cols << ", " << img_2.rows << ")" << std::endl;std::cout << "img_3.size: (" << img_3.cols << ", " << img_3.rows << ")" << std::endl;std::cout << "hconcat_mat_0.size: (" << hconcat_mat_0.cols << ", " << hconcat_mat_0.rows << ")" << std::endl;cv::imwrite("./hconcat_mat_0.jpg", hconcat_mat_0);/*** img_0.size: (1920, 1080)* img_1.size: (1920, 1080)* hconcat_mat_0.size: (1920, 2160)*/return 0;}

拼接后的图像如下所示。

5. 灵活拼接

有时候我们并不想在cv::hconcat和cv::vconcat的限制下进行图像拼接,而是想灵活的自定义拼接,此时我们可以使用先构建大图,再粘贴小图的方式。

#include <opencv2/opencv.hpp>  #include <iostream>  int main(int argc, char* argv[]){/** 读取两张要拼接的图像. */cv::Mat img_0 = cv::imread("000001.jpg", cv::IMREAD_UNCHANGED);cv::Mat img_1 = cv::imread("000002.jpg", cv::IMREAD_UNCHANGED);if (img_0.empty() || img_1.empty()) {  std::cerr << "Error loading images!" << std::endl;  return -1;  }  /** 以水平拼接为例. */int height = std::max(img_0.rows, img_1.rows);  int width = img_0.cols + img_1.cols;  /** 创建一个新的空白图像(底图). */cv::Mat result(height, width, CV_8UC3, cv::Scalar(255, 255, 255)); // 白色背景  /** 粘贴第一幅图像. */img_0.copyTo(result(cv::Rect(0, 0, img_0.cols, img_0.rows)));  /** 粘贴第二幅图像. */  img_1.copyTo(result(cv::Rect(img_0.cols, 0, img_1.cols, img_1.rows)));  cv::imwrite("FlexibleMosaic.jpg", result);  return 0;  }

拼接后图像如下所示。

这篇关于OpenCV杂记(2):图像拼接(hconcat, vconcat)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据