OpenCV-图像拼接(横向拼接纵向拼接)
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
功能函数
// 图像拼接
cv::Mat ImageSplicing(vector<cv::Mat> images,int type)
{if (type != 0 && type != 1)type = 0;int num = images.size();int newrow = 0;int newcol = 0;cv::Mat result;// 横向拼接if (type == 0){int minrow = 10000;for (int i = 0; i < num; ++i){if (minrow > images[i].rows)minrow = images[i].rows;}newrow = minrow;for (int i = 0; i < num; ++i){int tcol = images[i].cols*minrow / images[i].rows;int trow = newrow;cv::resize(images[i], images[i], cv::Size(tcol, trow));newcol += images[i].cols;if (images[i].type() != images[0].type())images[i].convertTo(images[i], images[0].type());}result = cv::Mat(newrow, newcol, images[0].type(), cv::Scalar(255, 255, 255));cv::Range rangerow, rangecol;int start = 0;for (int i = 0; i < num; ++i){rangerow = cv::Range((newrow - images[i].rows) / 2, (newrow - images[i].rows) / 2 + images[i].rows);rangecol = cv::Range(start, start + images[i].cols);images[i].copyTo(result(rangerow, rangecol));start += images[i].cols;}}// 纵向拼接else if (type == 1) {int mincol = 10000;for (int i = 0; i < num; ++i){if (mincol > images[i].cols)mincol = images[i].cols;}newcol = mincol;for (int i = 0; i < num; ++i){int trow = images[i].rows*mincol / images[i].cols;int tcol = newcol;cv::resize(images[i], images[i], cv::Size(tcol, trow));newrow += images[i].rows;if (images[i].type() != images[0].type())images[i].convertTo(images[i], images[0].type());}result = cv::Mat(newrow, newcol, images[0].type(), cv::Scalar(255, 255, 255));cv::Range rangerow, rangecol;int start = 0;for (int i = 0; i < num; ++i){rangecol= cv::Range((newcol - images[i].cols) / 2, (newcol - images[i].cols) / 2 + images[i].cols);rangerow = cv::Range(start, start + images[i].rows);images[i].copyTo(result(rangerow, rangecol));start += images[i].rows;}}return result;
}
测试代码
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;cv::Mat ImageSplicing(vector<cv::Mat> images, int type);int main()
{cv::Mat src1 = imread("1.jpg");cv::Mat src2 = imread("2.jpg");cv::Mat src3 = imread("3.jpg");cv::Mat src4 = imread("4.jpg");vector<cv::Mat> images;images.push_back(src1);images.push_back(src2);images.push_back(src3);images.push_back(src4);// 0为横向cv::Mat result1 = ImageSplicing(images, 0);// 1为纵向cv::Mat result2 = ImageSplicing(images, 1);imwrite("result1.jpg",result1);imwrite("result2.jpg",result2);return 0;
}// 图像拼接
cv::Mat ImageSplicing(vector<cv::Mat> images,int type)
{if (type != 0 && type != 1)type = 0;int num = images.size();int newrow = 0;int newcol = 0;cv::Mat result;// 横向拼接if (type == 0){int minrow = 10000;for (int i = 0; i < num; ++i){if (minrow > images[i].rows)minrow = images[i].rows;}newrow = minrow;for (int i = 0; i < num; ++i){int tcol = images[i].cols*minrow / images[i].rows;int trow = newrow;cv::resize(images[i], images[i], cv::Size(tcol, trow));newcol += images[i].cols;if (images[i].type() != images[0].type())images[i].convertTo(images[i], images[0].type());}result = cv::Mat(newrow, newcol, images[0].type(), cv::Scalar(255, 255, 255));cv::Range rangerow, rangecol;int start = 0;for (int i = 0; i < num; ++i){rangerow = cv::Range((newrow - images[i].rows) / 2, (newrow - images[i].rows) / 2 + images[i].rows);rangecol = cv::Range(start, start + images[i].cols);images[i].copyTo(result(rangerow, rangecol));start += images[i].cols;}}// 纵向拼接else if (type == 1) {int mincol = 10000;for (int i = 0; i < num; ++i){if (mincol > images[i].cols)mincol = images[i].cols;}newcol = mincol;for (int i = 0; i < num; ++i){int trow = images[i].rows*mincol / images[i].cols;int tcol = newcol;cv::resize(images[i], images[i], cv::Size(tcol, trow));newrow += images[i].rows;if (images[i].type() != images[0].type())images[i].convertTo(images[i], images[0].type());}result = cv::Mat(newrow, newcol, images[0].type(), cv::Scalar(255, 255, 255));cv::Range rangerow, rangecol;int start = 0;for (int i = 0; i < num; ++i){rangecol= cv::Range((newcol - images[i].cols) / 2, (newcol - images[i].cols) / 2 + images[i].cols);rangerow = cv::Range(start, start + images[i].rows);images[i].copyTo(result(rangerow, rangecol));start += images[i].rows;}}return result;
}
测试效果
![](/assets/blank.gif)
![](/assets/blank.gif)
本文提供的图像拼接函数,可以实现如“长图拼接王”这类小程序的类似功能,大家可以将该函数封装在软件中自由使用~
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!
OpenCV-图像拼接(横向拼接纵向拼接)相关推荐
- python+opencv图像拼接-python opencv 图像拼接的实现方法
初级的图像拼接为将两幅图像简单的粘贴在一起,仅仅是图像几何空间的转移与合成,与图像内容无关.高级图像拼接也叫作基于特征匹配的图像拼接,拼接时消去两幅图像相同的部分,实现拼接合成全景图. 具有相同尺寸的 ...
- opencv实现图像的拼接功能
opencv 图像拼接. 代码来自版本2.4.9,stitching.cpp /*M/// // // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INS ...
- python实现两张图片横向和纵向拼接
本文实例为大家分享了python实现图片横向和纵向拼接的具体代码, 这里主要用Python扩展库pillow中Image对象的paste()方法把两张图片拼接起来供大家参考,具体内容如下: 一.代码: ...
- OpenCV图像拼接之Stitching和Stitching_detailed
Stitcher类与detail命名空间 OpenCV提供了高级别的函数封装在Stitcher类中,使用很方便,不用考虑太多的细节. 低级别函数封装在detail命名空间中,展示了opencv算法实现 ...
- dataframe 上下拼接_pandas DataFrame 的横向纵向拼接组合
concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat( ...
- matlab 数组横向纵向拼接
clear all; clc;ri0=1;shi0=11;fen0=12; shuo=ri0+shi0/24+fen0/(24*60); filepath='E:\夏季\观测\效率\'; dat=[f ...
- dataframe横向和纵向拼接
横向拼接 import pandas as pd import numpy as npdf1 = pd.DataFrame([['Tom','2001',98],['Jack','2002',63], ...
- opencv 图像拼接和图像融合技术
图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要. 再举一个身边的例子吧,你用你的手 ...
- OpenCV图像拼接和图像融合技术
转自:https://www.cnblogs.com/skyfsm/p/7411961.html 图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效 ...
最新文章
- SQL Sever 各版本下载 SQL Server 2012下载SQL Server 2008下载SQL Server 2005 下载SQL Server 2000 下载...
- 17 张程序员壁纸(赶快挑一张吧)
- 单列集合Set的实现类TreeSet
- numpy 数组访问方式_索引、切片、迭代
- 征途手游2新开区服务器维护多久,《征途2手游》开启新服“星火燎原”
- C++ 关于复制、移动构造函数和移动、复制 赋值运算符的重载问题;
- Unitest框架的使用(二)Unittest断言及应用
- TensorFlow开发者会峰会:支持Swift,更好的支持JavaScript
- [mark] first shellcode
- EditText光标颜色设置
- 帮你解决Kali Linux 外接无线网卡显示不出来的问题
- 单播、广播、组播的区别(转)
- 记事本字符编码没有Unicode选项
- Java中violate关键字详解(2)?真正了解violate
- 企业信息安全应对勒索软件的攻击难度提升
- 收购游戏手机厂商黑鲨背后,腾讯走了一步好棋?
- 用STM32的UART实现DMX512
- 逛网上书店、看书评 and .....买书
- 【人物采访】《有妖气》主制作人耿兵:创新IP打造特色手游
- 意志力是一种有限的资源吗?