OpenCV-图像拼接(横向拼接&纵向拼接)

简介: OpenCV-图像拼接(横向拼接&纵向拼接)

功能函数

// 图像拼接
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月前
|
计算机视觉 Python
Opencv学习笔记(四):如何通过cv2或者通过matplotlib来将多张图拼接成一张图输出
这篇文章介绍了如何使用OpenCV和matplotlib将多张图像拼接成一张图进行输出,并比较了两者的效果和使用注意事项。
75 0
Opencv学习笔记(四):如何通过cv2或者通过matplotlib来将多张图拼接成一张图输出
|
6月前
|
计算机视觉 Python
OpenCV 4基础篇| OpenCV图像的拼接
OpenCV 4基础篇| OpenCV图像的拼接
|
6月前
|
计算机视觉
OpenCV(十):图像缩放、翻转、拼接的介绍与使用
OpenCV(十):图像缩放、翻转、拼接的介绍与使用
135 0
|
6月前
|
计算机视觉 Python
OpenCV图像处理-图片拼接(Python)
1. 图片拼接原理 对于图像拼接主要分为两部分:1.特征点匹配,确定两幅图之间的位置关系;2.把所有图像投影变换到同一坐标系,并完成对接与融合。
206 0
|
计算机视觉
【OpenCV图像处理13】图像拼接
【OpenCV图像处理13】图像拼接
196 0
|
监控 算法 机器人
Baumer工业相机堡盟相机如何通过BGAPI SDK联合OpenCV进行图像简单拼接和显示(C++)
Baumer工业相机堡盟相机如何通过BGAPI SDK联合OpenCV进行图像简单拼接和显示(C++)
101 0
|
机器学习/深度学习 编解码 算法
openCV 第四篇 角点检测、图像特征、图片拼接
openCV 第四篇 角点检测、图像特征、图片拼接
openCV 第四篇 角点检测、图像特征、图片拼接
|
机器学习/深度学习 算法 机器人
计算机视觉教程7-2: 基于OpenCV的多图像拼接、配准与美化
计算机视觉教程7-2: 基于OpenCV的多图像拼接、配准与美化
712 0
计算机视觉教程7-2: 基于OpenCV的多图像拼接、配准与美化
|
算法 计算机视觉
OPENCV 图像拼接 stitching的使用
图像拼接技术,现在有非常广泛的应用,如小型机器人的单目视觉的视野较为小,使机器人在应用时有一定的局限性,双目视觉能提供更广阔的视野,双目视觉中较为常用的是对左右两个摄像头获取的识图通过拼接来获取更广阔的视野,再如较为热门的VR,Youtube也极大地运用图像拼接的技术。 图像拼接主要分为几个主要的步骤: (1)图像的校正:由于成象器件拍摄姿态和扫描非线性会引起的图象几何失
3496 0
|
算法 测试技术 计算机视觉
OpenCV中的全景拼接例程
使用Stitcher类,通过createDefault()方法创建拼接对象,通过stitch()方法执行默认的自动拼接。自动拼接和07年Brown和Lowe发表的论文描述的步骤基本一致,只不过使用的特征提取算法是ORB,而不是慢吞吞、有专利保护的SIFT和SURF。
1676 0