OpenCV常用图像拼接方法(二):基于模板匹配拼接

    OpenCV常用图像拼接方法将分为四个部分与大家共享,这里是第二种方法,欢迎关注后续,此处子系统与素材链接位于文章末尾

    OpenCV常用图像拼接方法(二):基于模板匹配的图像拼接。基于模板的图像拼接特征和适用范围图像有重合区域,且待分割图像之间无明显尺度变化和畸变。常用实例:两个相邻相机水平拍摄图像拼接。优点:简单,快速(相比于SIFT特征匹配拼接)。

    这里没有找到更好的实例图片,所以仍使用上一篇文章中的图片,截取如下两部分ROI作为待拆分图像。

   待拼接图①:

    待拼接图②:

    思路:在图①中截取部分公共区域ROI作为模板,利用模板在图②中匹配,得到最佳匹配位置后计算X和Y方向需要平移的距离,将图②对应的拼接到大图。如下,模板为青色区域:

    部分代码和效果如下:

// Image_Stitch_With_Matchtemplate.cpp
// 环境VS2017 + OpenCV4.4.0
// 功能:基于模板匹配的图像拼接
// 特点:图像有重合区域,且待拼接图像之间无明显尺度变换和畸变

#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
  Mat imgL = imread("A.jpg");
  Mat imgR = imread("B.jpg");
  double start = getTickCount();
  Mat grayL, grayR;
  cvtColor(imgL, grayL, COLOR_BGR2GRAY);
  cvtColor(imgR, grayR, COLOR_BGR2GRAY);

  Rect rectCut = Rect(372, 122, 128, 360);
  Rect rectMatched = Rect(0, 0, imgR.cols / 2, imgR.rows);
  Mat imgTemp = grayL(Rect(rectCut));
  Mat imgMatched = grayR(Rect(rectMatched));

  int width = imgMatched.cols - imgTemp.cols + 1;
  int height = imgMatched.rows - imgTemp.rows + 1;
  Mat matchResult(height, width, CV_32FC1);
  matchTemplate(imgMatched, imgTemp, matchResult, TM_CCORR_NORMED);
  normalize(matchResult, matchResult, 0, 1, NORM_MINMAX, -1);  //归一化到0--1范围

  double minValue, maxValue;
  Point minLoc, maxLoc;
  minMaxLoc(matchResult, &minValue, &maxValue, &minLoc, &maxLoc);

  Mat dstImg(imgL.rows, imgR.cols + rectCut.x - maxLoc.x, CV_8UC3, Scalar::all(0));
  Mat roiLeft = dstImg(Rect(0, 0, imgL.cols, imgL.rows));
  imgL.copyTo(roiLeft);

  Mat debugImg = imgR.clone();
  rectangle(debugImg, Rect(maxLoc.x, maxLoc.y, imgTemp.cols, imgTemp.rows), Scalar(0, 255, 0), 2, 8);
  imwrite("match.jpg", debugImg);

  Mat roiMatched = imgR(Rect(maxLoc.x, maxLoc.y - rectCut.y, imgR.cols - maxLoc.x, imgR.rows - 1 - (maxLoc.y - rectCut.y)));
  Mat roiRight = dstImg(Rect(rectCut.x, 0, roiMatched.cols, roiMatched.rows));

  roiMatched.copyTo(roiRight);

  double end = getTickCount();
  double useTime = (end - start) / getTickFrequency();
  cout << "use-time : " << useTime << "s" << endl;

  imwrite("dst.jpg", dstImg);
  cout << "Done!" << endl;
  return 0;

}

匹配结果:

    拼接结果:

    本次耗时如下图:( 工业相机1200W图片拼接大约200ms):

  • 3
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
基于特征点的模板匹配是一种在图像匹配中广泛应用的方法。它通过提取两幅图像之间的重要特征点来实现匹配。在相机标定的情况下,可以支持图像的位移、旋转、缩放和透视形变等操作。具体而言,该方法首先会提取图像中的特征点,然后通过对应的特征点进行匹配,输出两幅图像之间的映射关系。这样就可以实现在两幅图像之间进行拼接、对齐或其他操作。在OpenCV中,可以使用函数matchTemplate()来实现基于特征点的模板匹配算法。该函数可以接受模板图像和目标图像作为输入,并返回匹配的结果。例如,可以使用函数cv2.matchTemplate()来计算目标图像中与模板图像最相似的位置,并可以设置阈值来确定匹配的精确度。然后可以通过绘制矩形框来标记匹配到的位置。以上就是基于特征点的模板匹配原理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [OpenCV基于形状的模板匹配](https://blog.csdn.net/qq_44870829/article/details/111034361)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于opencv模板匹配详解](https://blog.csdn.net/ove_z/article/details/128413515)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Color Space

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值