Opencv学习笔记(五) -- 图像的拼接

1.涉及函数

1.1 rowRange

  • 函数功能
    获取图像中的选定行,该函数为Mat类的一个方法。
  • 具体定义
inline Mat Mat::rowRange(int startrow, int endrow) const
{
    return Mat(*this, Range(startrow, endrow), Range::all());
}
  • 相关参数
    int startrow – 起始行号,下标从0开始
    int endrow – 结束行号
  • 返回值
    Mat – 包含选定行内容的图像矩阵
    注意:
    该函数返回的图像矩阵为原始图像的浅拷贝,改变目标图像矩阵,同样会改变原始图像。

1.2 colRange

  • 函数功能
    获取图像中的选定列,该函数为Mat类的一个方法。
  • 具体定义
inline Mat Mat::colRange(int startcol, int endcol) const
{
    return Mat(*this, Range::all(), Range(startcol, endcol));
}
  • 相关参数
    int startcol – 起始列号
    int endcol – 结束列号
  • 返回值
    Mat – 包含指定列内容的图像矩阵
    注意:
    该函数返回的图像矩阵为原始图像的浅拷贝,改变目标图像矩阵,同样会改变原始图像。

1.3 colRange

  • 函数功能
    将当前图像内容拷贝至目标图像,该函数为Mat类的一个方法。
  • 具体定义
void copyTo( OutputArray m ) const;
  • 相关参数
    OutputArray m – 目标图像
  • 返回值

2.代码实例

  • 代码说明
    本例主要展示如何对两幅图像进行拼接操作。
  • 测试平台
    1.开发语言:C++
    2.开发工具:VS2015
    3.操作系统:Win7 X64
  • 具体代码
#include <iostream>
using namespace std;

#include "cv.h"
#include "opencv2\opencv.hpp"
using namespace cv;

#if _DEBUG
#pragma comment(lib,"opencv_world340d.lib")
#else
#pragma comment(lib,"opencv_world340.lib")
#endif

//函数功能:按照上下进行图像拼接,拼接之后,A图像在上,B图像在下
//参数:    cv::Mat A[IN]                    -- 图像A
//          cv::Mat B[IN]                    -- 图像B
//          cv::Mat                          -- 拼接后的图像
cv::Mat TopBottomMerge(cv::Mat A, cv::Mat B)
{
    int totalRows = A.rows + B.rows;
    cv::Mat mergedDescriptors(totalRows, A.cols, A.type());
    cv::Mat submat = mergedDescriptors.rowRange(0, A.rows);
    A.copyTo(submat);
    submat = mergedDescriptors.rowRange(A.rows, totalRows);
    B.copyTo(submat);
    return mergedDescriptors;
}

//函数功能:按照左右进行图像拼接,拼接之后,A图像在左,B图像在右
//参数:    cv::Mat A[IN]                    -- 图像A
//          cv::Mat B[IN]                    -- 图像B
//          cv::Mat                          -- 拼接后的图像
cv::Mat LeftRightMerge(cv::Mat A, cv::Mat B)
{
    int totalCols = A.cols + B.cols;
    cv::Mat mergedDescriptors(A.rows, totalCols, A.type());
    cv::Mat submat = mergedDescriptors.colRange(0, A.cols);
    A.copyTo(submat);
    submat = mergedDescriptors.colRange(A.cols, totalCols);
    B.copyTo(submat);
    return mergedDescriptors;
}

int main()
{
    Mat src1 = imread("D:\\OpencvTest\\lena.jpg");
    Mat src2 = imread("D:\\OpencvTest\\test2.jpg");

    if (src1.data != NULL && src2.data!=NULL)
    {
        //图像上下拼接
        Mat mergeTB = TopBottomMerge(src1, src2);

        //图像左右拼接
        Mat mergeLR = LeftRightMerge(src1, src2);

        imshow("图A", src1);
        imshow("图B", src2);

        imshow("上下拼接", mergeTB);
        imshow("左右拼接", mergeLR);

        cvWaitKey(0);
    }
    else
    {
        cout << "图片加载失败,请检查文件是否存在!" << endl;
    }

    getchar();
    return 0;
}
  • 输出截图
    这里写图片描述

栏目导航
上一篇:Opencv学习笔记(四) – 图像的放大与缩小
下一篇:Opencv学习笔记(六) – 图像的扣取

猜你喜欢

转载自blog.csdn.net/u014337397/article/details/80791244