首页 > 编程语言 >实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)

时间:2022-12-01 10:07:52浏览次数:50  
标签:匹配 temp mask 源码 result 掩码 模板



导读

本文将重点介绍 OpenCV带掩码(mask)的模板匹配使用技巧与演示。(公众号:OpenCV与AI深度学习)

 背景介绍

    在使用模板匹配时,一些特定情况中我们并不需要将整个模板图像拿来匹配,而只需要其中特定的部分做模板,其他部分则加入反而会影响匹配结果。如下图所示: 

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_#include

原本左边的模板图除了我们想要的部分外,还有外部的白色背景区域,如果将整张图作为模板,来做模板匹配,匹配结果会出错,结果如下:

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_深度学习_02

加上掩码后匹配,结果如下:

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_模板匹配_03

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_深度学习_04

详细步骤

    在核心方法还是使用OpenCV的matchTemplate函数,只是这次我们要指定mask(掩码),匹配时对于掩码中的非0像素匹配算法起作用,掩码中的灰度值为0像素位置,匹配算法不起作用

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_深度学习_05

【1】通过模板图像获得掩码图像。

这里获取掩码的方法不唯一,可以通过预先加载获得,可以通过二值化,图像分割等手段获得,最终的掩码图像需要与模板图像大小一致,同时为单通道图像,mask的非0像素对应的位置就是我们关心的匹配内容,灰度值为的0像素对应的位置则是无关内容。本文是通过二值化获得如下右图的mask图像:

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_模板匹配_03

Mat mask;
cvtColor(temp, mask, COLOR_BGR2GRAY);
threshold(mask, mask, 10, 255, THRESH_BINARY);
imshow("mask", mask);

【2】模板匹配,指定mask参数为步骤【1】获得的掩码图像。

matchTemplate(src, temp, result, TM_CCOEFF_NORMED, mask);

匹配结果与源码如下:

实例一:

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_模板匹配_07

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_模板匹配_08

实例二:

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_#include_09

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_模板匹配_10

实例三:

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_#include_11

实战 | OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)_#include_12

// 公众号:OpenCV与AI深度学习
// 作 者:Color Space


#include "pch.h"
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;


void main()
{
///单模板匹配
Mat img = imread("A2.png");
Mat temp = img(Rect(420, 20, 90, 90)).clone();
imshow("ROI", temp);
waitKey();

Mat src = img(Rect(0, 0, 400, img.rows)); //待搜索图像
imshow("temp", temp);
imshow("src", src);


Mat mask;
cvtColor(temp, mask, COLOR_BGR2GRAY);
threshold(mask, mask, 10, 255, THRESH_BINARY);
imshow("mask", mask);


Mat dst = src.clone(); //原图备份


int width = src.cols - temp.cols +1; //result 宽度
int height = src.rows - temp.rows +1; //result 高度


Mat result(height, width, CV_32FC1); //创建结果映射图像


matchTemplate(src, temp, result, TM_CCOEFF_NORMED, mask); //化相关系数匹配最佳值 1
imshow("result", result);
//normalize(result, result, 0, 1, NORM_MINMAX, -1); //归一化到0--1范围


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


cout<<"minValue="<<minValue<<endl;
cout<<"maxValue="<<maxValue<<endl;


rectangle(dst, maxLoc, Point(maxLoc.x+temp.cols, maxLoc.y+temp.rows), Scalar(0, 255, 0), 2, 8);
imshow("dst", dst);
waitKey(0);
}


—THE END—


觉得有用,记得点个赞


标签:匹配,temp,mask,源码,result,掩码,模板
From: https://blog.51cto.com/stq054188/5901153

相关文章

  • 实战 | 电感元件定位--Halcon与OpenCV实现详解(附源码)
    导读本文给大家分享一个电感元件定位实例,并附Halcon和OpenCV实现步骤和代码。(公众号:OpenCV与AI深度学习) 背景介绍  本实例来源于EmguCV学员交流群,已经同意使用图片......
  • OpenCV技巧 | 二值图孔洞填充方法与实现(附源码)
    重磅干货,第一时间送达导读本文主要介绍使用OpenCV对二值图做孔洞填充的方法与实现。背景介绍为什么要做孔洞填充?因为在部分情况下,二值图内部的孔洞和外部轮廓是一个整体,填......
  • top源码可编译版
    循环打印当前系统的进程状态信息/**Copyright(c)2008,TheAndroidOpenSourceProject*Allrightsreserved.**Redistributionanduseinsourceandbin......
  • JUC源码学习笔记6——ReentrantReadWriteLock
    系列文章目录和关于我阅读此文需要有AQS独占和AQS共享的源码功底,推荐阅读:1.JUC源码学习笔记1——AQS独占模式和ReentrantLock2.JUC源码学习笔记2——AQS共享和Semaphore......
  • Caffeine 源码、架构、原理(史上最全,10W超级字长文)
    文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面......
  • drupal源码分析
    说实在的,drupal确实很复杂,在国内用的人也不多,唯一看的懂的中文技术网站估计就是drupalchina.org了,但是对于源代码的分析是少之又少.没有办法,只能自己来从头看起了!越......
  • RocketMQ系列-搭建Namesrv源码调试环境
    RocketMQ系列-搭建Namesrv源码调试环境在学习任何一个技术框架的时候,我们通常都是先了解是什么,有什么作用、解决什么问题、设计亮点和设计思想是什么;当然对于技术学习上来......
  • MySQL源码编译安装
    MySQL源码编译安装Linux环境:CentOS7.6MySQL版本:MySQL5.7.37安装路径:/usr/local/mysql1.创建相关目录#创建用户useradd-s/sbin/nologinmysql#创建安装目录并......
  • 计算机视觉的常用测试数据集和源码
    以下是computervision:algorithmandapplication计算机视觉算法与应用这本书中附录里的关于计算机视觉的一些测试数据集和源码站点,整理了下,加了点中文注解。ComputerVision......
  • 搞清楚Spring事件机制后:Spring的源码看起来简单多了
    Spring框架已然是Javaeee开发领域的霸主,无论是使用SpringBoot还是SpringCloud,都离不开Spring框架。作为Java开发者,无论是面试求职还是日常开发,就必须得熟练掌握、运用Sprin......