首页 > 其他分享 >OpenCV常用图像拼接方法(二) :基于模板匹配拼接

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

时间:2022-10-18 12:31:38浏览次数:42  
标签:Mat cols maxLoc OpenCV 拼接 模板 imgR Rect


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

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

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

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

    待拼接图①:

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

    待拼接图②:

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

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

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

    部分代码和效果如下:


// 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;

}

    匹配结果:

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

    拼接结果:

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

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

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

    源码和图片素材百度网盘下载地址:

    链接:https://pan.baidu.com/s/1c4OL5NxB2LE-Gc4XQd54Fw

    提取码:ttxw

标签:Mat,cols,maxLoc,OpenCV,拼接,模板,imgR,Rect
From: https://blog.51cto.com/stq054188/5765809

相关文章

  • 界面控件DevExpress WinForm中文指南 - 使用HTML&CSS模板的条件样式
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office......
  • C++代码模板
    #include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>#include<map>#include<vector>#definelllonglong......
  • 【散列】散列表HashTable分离链接法类模板的实现
    分离链接法(separatechaining),做法是将散列到同一个值得所有元素保留到一个链表List中。如果这个元素是个新的元素,那么它将被插入到链表的前端。插入前端的原因是:常......
  • [CQOI2006]凸多边形 /【模板】半平面交
    洛谷题意:逆时针给出\(n(n<=10)\)个凸多边形的顶点坐标,求它们交的面积。学长博客,计算几何知识全面半平面交问题详细讲解还有一些前置知识。两向量\((x_1,y_1),(x_2,y_2)......
  • 2022下半年 Acwing 第一篇:快排模板
    模板内容:C++voidquick(intq[],intl,intr){if(l>=r)return;intx=q[(l+r+1)>>1],i=l-1,j=r+1;while(i<j){doi++;while(q[i]<x);......
  • opencv
    介绍opencv是一个开源的用于图像处理的库,它对包括C/C++、java、python等语言有支持。安装将opencv\python\2.7\x64\cv2.pyd拷贝到python的安装目录下:Python27\Lib\site-pac......
  • Python字符串拼接(包含字符串拼接数字)
    在 Python 中拼接(连接)字符串很简单,可以直接将两个字符串紧挨着写在一起,具体格式为:strname="str1""str2"strname表示拼接以后的字符串变量名,str1和str2是要拼接......
  • 【Nuxt3从入门到实战】第三啪:巧用布局模板,高效开发从这里开始!
    前言大家好,我是村长,欢迎关注我的公众号村长学前端和B站Young村长!上一篇写了nuxt3路由系统,我们试用了两个重要功能:​​动态路由​​​和​​嵌套路由​​。体验便捷的同时,当......
  • 【模板】快速数论变换
    依旧是常数很大的板子。在H_Kaguya改动之前,达到了\(2.61\,s\)的绝望时间现在好多了,\(1.10\,s\)。(内存不连续访问我会记你一辈子的)#include<iostream>charch;sho......
  • Halcon实例转OpenCV--低对比度图像中提取圆形轮廓(附源码)
    导读本文主要介绍一个在低对比度图像中提取圆形轮廓的实例,并将Halcon实现转为OpenCV。实例来源Halcon例程dyn_threshold.hdev--动态阈值算子使用实例。原图:Halcon实现效果:......