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學習筆記(六) – 圖像的扣取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章