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

相关文章

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

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

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

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

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

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函