作者:翟天保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;
}

测试效果

图1 横向拼接

图2 纵向拼接

本文提供的图像拼接函数,可以实现如“长图拼接王”这类小程序的类似功能,大家可以将该函数封装在软件中自由使用~

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

OpenCV-图像拼接(横向拼接纵向拼接)相关推荐

  1. python+opencv图像拼接-python opencv 图像拼接的实现方法

    初级的图像拼接为将两幅图像简单的粘贴在一起,仅仅是图像几何空间的转移与合成,与图像内容无关.高级图像拼接也叫作基于特征匹配的图像拼接,拼接时消去两幅图像相同的部分,实现拼接合成全景图. 具有相同尺寸的 ...

  2. opencv实现图像的拼接功能

    opencv 图像拼接. 代码来自版本2.4.9,stitching.cpp /*M/// // // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INS ...

  3. python实现两张图片横向和纵向拼接

    本文实例为大家分享了python实现图片横向和纵向拼接的具体代码, 这里主要用Python扩展库pillow中Image对象的paste()方法把两张图片拼接起来供大家参考,具体内容如下: 一.代码: ...

  4. OpenCV图像拼接之Stitching和Stitching_detailed

    Stitcher类与detail命名空间 OpenCV提供了高级别的函数封装在Stitcher类中,使用很方便,不用考虑太多的细节. 低级别函数封装在detail命名空间中,展示了opencv算法实现 ...

  5. dataframe 上下拼接_pandas DataFrame 的横向纵向拼接组合

    concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat( ...

  6. matlab 数组横向纵向拼接

    clear all; clc;ri0=1;shi0=11;fen0=12; shuo=ri0+shi0/24+fen0/(24*60); filepath='E:\夏季\观测\效率\'; dat=[f ...

  7. dataframe横向和纵向拼接

    横向拼接 import pandas as pd import numpy as npdf1 = pd.DataFrame([['Tom','2001',98],['Jack','2002',63], ...

  8. opencv 图像拼接和图像融合技术

    图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要. 再举一个身边的例子吧,你用你的手 ...

  9. OpenCV图像拼接和图像融合技术

    转自:https://www.cnblogs.com/skyfsm/p/7411961.html 图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效 ...

最新文章

  1. SQL Sever 各版本下载 SQL Server 2012下载SQL Server 2008下载SQL Server 2005 下载SQL Server 2000 下载...
  2. 17 张程序员壁纸(赶快挑一张吧)
  3. 单列集合Set的实现类TreeSet
  4. numpy 数组访问方式_索引、切片、迭代
  5. 征途手游2新开区服务器维护多久,《征途2手游》开启新服“星火燎原”
  6. C++ 关于复制、移动构造函数和移动、复制 赋值运算符的重载问题;
  7. Unitest框架的使用(二)Unittest断言及应用
  8. TensorFlow开发者会峰会:支持Swift,更好的支持JavaScript
  9. [mark] first shellcode
  10. EditText光标颜色设置
  11. 帮你解决Kali Linux 外接无线网卡显示不出来的问题
  12. 单播、广播、组播的区别(转)
  13. 记事本字符编码没有Unicode选项
  14. Java中violate关键字详解(2)?真正了解violate
  15. 企业信息安全应对勒索软件的攻击难度提升
  16. 收购游戏手机厂商黑鲨背后,腾讯走了一步好棋?
  17. 用STM32的UART实现DMX512
  18. 逛网上书店、看书评 and .....买书
  19. 【人物采访】《有妖气》主制作人耿兵:创新IP打造特色手游
  20. 意志力是一种有限的资源吗?

热门文章

  1. 【沃顿商学院学习笔记】商业分析——People Analytics:13 评估协作网络 EVALUATING COLLABORATION NETWORKS
  2. JavaScript onscroll和scrollTop
  3. 超宽带(UWB)学习笔记——角度的测量
  4. Canal监控MySQL数据库实现数据同步
  5. 一行代码帮你检测Android模拟器优劣
  6. 能读懂人心的人工智能 甚至可能植入人类大脑
  7. 数据化管理之企业对标管理与标杆选择
  8. 网络舆情事件的监测跟踪方案
  9. 《操作系统》课程设计报告——多用户文件系统设计
  10. 离散余弦变换java实现_离散余弦变换(含源码)