首页 > 其他分享 >opencv 基于形状的模板匹配

opencv 基于形状的模板匹配

时间:2023-09-22 23:36:07浏览次数:37  
标签:匹配 target image cv2 opencv contours template 模板 view

1.问题或需求描述

opencv 基于形状的模板匹配测试

2.解决方法或原理:

主要步骤:

  1. 使用opencv查找轮廓(findContours)
  2. 匹配轮廓(形状)(matchShapes)的相似度

python代码:

import cv2

# 读取目标图像
target_image = cv2.imread('target.png', cv2.IMREAD_COLOR)
# 读取模板图像
template_image = cv2.imread('template.png', cv2.IMREAD_COLOR)

# 转换为灰度图像
gray_target_image = cv2.cvtColor(target_image, cv2.COLOR_BGR2GRAY)
gray_template_image = cv2.cvtColor(template_image, cv2.COLOR_BGR2GRAY)
# 扩展通道数以绘制色彩
view = cv2.merge((gray_target_image, ) * 3)

# 二值化
_, gray_target_image = cv2.threshold(gray_target_image, 50, 255, cv2.THRESH_BINARY)
_, gray_template_image = cv2.threshold(gray_template_image, 50, 255, cv2.THRESH_BINARY)

# 显示图像
cv2.imshow('template', gray_template_image)
cv2.imshow('match', view)

# 提取图像轮廓
target_contours, target_hierarchy = cv2.findContours(gray_target_image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
template_contours, template_hierarchy = cv2.findContours(gray_template_image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

# 调试输出
print('target_contours num:',len(target_contours))
print('template_contours num:',len(template_contours))

# 存储各个形状匹配值
values = []
for v in range(len(target_contours)):
    # 计算形状匹配值
    match_value = cv2.matchShapes(target_contours[v], template_contours[0], cv2.CONTOURS_MATCH_I1, 0.0)
    print(f"形状匹配值: {match_value}")
    values.append(match_value)
    
    # 绘制当前匹配轮廓
    view_copy = view.copy()
    cv2.drawContours(view_copy, [target_contours[v]], -1, (0, 255, 0), thickness=cv2.FILLED)
    cv2.putText(view_copy, f"match value: {match_value}", (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
    cv2.imshow('match', view_copy)
    cv2.waitKey(500)


# 显示匹配结果
idx = values.index(min(values))
cv2.drawContours(view, [target_contours[idx]], -1, (0, 255, 0), thickness=cv2.FILLED)
cv2.putText(view, f"match value: {values[idx]}", (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
cv2.imshow('match', view)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.结果演示:

opencv 基于形状的模板匹配_模板匹配

opencv 基于形状的模板匹配_python_02

标签:匹配,target,image,cv2,opencv,contours,template,模板,view
From: https://blog.51cto.com/firswof/7572880

相关文章

  • pytest + yaml 框架 -55. raw 不转义模板语法
    前言在yaml文件中,设置的引用变量语法是${var},最近有小伙伴提到一个需求:请求参数的内容需要有特殊符号${var},希望不被转义,不要引用变量,直接用原始数据即可。raw忽略模板语法Jinja2提供了"raw"语句来忽略所有模板语法。语法示例{%raw%}hello${var}world!{%end......
  • ubuntu20安装opencv3.4.9 多版本
    1下载源码下载源码https://github.com/opencv/opencv/releases/tag/3.4.9  下载扩展源码 https://github.com/opencv/opencv_contrib/releases/tag/3.4.9 2安装依赖sudoapt-getupdatesudoapt-getinstall-ybuild-essentialcmakegitlibgtk2.0-devpkg-......
  • [leetcode] 10. 正则表达式匹配
    10.正则表达式匹配给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。'.'匹配任意单个字符'*'匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。示例1:输入:s="aa",p="a"输出:false解释:"a"无......
  • Python,OpenCV的图像直角坐标系转极坐标系的函数
    Hough圆检测获取瓶口位置和大小'''hough圆变换'''cimg=cv2.cvtColor(bottle,cv2.COLOR_GRAY2BGR)#转换成彩色图circles=cv2.HoughCircles(median,cv2.HOUGH_GRADIENT,1,100,param1=100,param2=60,minRadius=150,maxRadius=160)......
  • 9.22模板
    最长公共前缀编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例1:输入:strs=["flower","flow","flight"]输出:"fl"示例2:输入:strs=["dog","racecar","car"]输出:""解释:输入不存在公共前缀。#inc......
  • 编译 OpenCV 的 Python 依赖
    这一次编译OpenCV的Python依赖为了方便运行我们使用Docker进行编译,环境准备如下:系统依赖:Ubuntu18.04Python版本:3.6,Ubuntu18.04官方源安装的默认版本OpenCV版本:3.4.16,是目前3.x的最新版CMake版本:3.10GCC版本(含C++):7.5我们首先拉取并进入镜像:dock......
  • 【枚举】【贪心技巧】【集训队互测2021】子集匹配
    题目描述给定\(n,k(2k\geqn)\),二进制中有\(k\)个\(1\)的不超过\(n\)位的数有\(\binom{n}{k}\)个,有\(k-1\)个\(1\)的有\(\binomn{k-1}\)个,后者显然大于等于前者,要求对于每一个\(k\)个\(1\)的数\(x\),都找出一个\(k-1\)位的数\(y\)与之对应,且\(x......
  • docker-dockerfile-docker镜像制作-基于本地模板创建镜像
    1.基于本地模板创建基于本地模板创建Docker镜像的步骤可以归纳如下:下载所需模板:首先,你需要在网络上找到你需要的Docker模板,并下载到本地。你可以从DockerHub或者其他的镜像仓库中获取到所需的模板。解压下载的模板:可以使用类似于7-Zip这样的工具来解压下载的模板文件。导入......
  • 模板特化的多维度挖掘
      假如我有一个需求,就是如果传入的参数是int类型,我就输出int类型,否则就输出T。很显然,根据模板的基础知识,我们可以这么写template<classT>voidf(T){std::cout<<"T\n";}template<>voidf(int){std::cout<<"int\n";}  除了这样写,还有别的写法吗。我......
  • 最短路基础实现方法模板合集
    $\color{#39c588}{关于最短路}$$\color{purple}{首先是最短路的算法选择思路捏,直接来个Y总的图}$++$\color{purple}{单源汇问题}$++$\color{orange}{朴素版Dijkstra}$实现思路//朴素版Dijkstrao(n^2)--处理稠密图--稠密图用邻接矩阵存储//1.初始化邻接......