【OpenCV-Python】教程:3-9 轮廓(4)更多函数

news2024/12/23 1:38:54

OpenCV Python 轮廓

【目标】

  • 凸性缺陷查找
  • 点与多边形的关系
  • 不同形状的匹配

【代码】

在这里插入图片描述

左图中红色点为凸性检测的缺陷点,即凹点
右图为了验证点与多边形关系而做的图,也是官网要求做的练习。

import cv2 
import numpy as np 

img = cv2.imread('star.png', 0)
colorimg = cv2.imread('star.png', 1)
convexHullImg = colorimg.copy()
ret, thresh = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)

# 寻找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]

# 凸包
hull = cv2.convexHull(cnt, returnPoints=False)
defects = cv2.convexityDefects(cnt, hull)

# 画出缺陷凹点
for i in range(defects.shape[0]):
    startptidx, endptidx, farptidx, dis = defects[i, 0]
    startpt = tuple(cnt[startptidx][0])
    endpt = tuple(cnt[endptidx][0])
    farpt = tuple(cnt[farptidx][0])    
    cv2.line(convexHullImg, startpt, endpt, (0, 255, 255))
    cv2.circle(convexHullImg, farpt, 3, (0, 0, 255), 3)



# 根据点在图像中和轮廓中的位置,画出颜色图
polygonTestImg = colorimg.copy()
# cv2.circle(polygonTestImg, (280, 180), 3, (0, 0, 255), 3)
dist = cv2.pointPolygonTest(cnt, (50, 50), True)
h, w, _ = polygonTestImg.shape

# 在轮廓上,为白色
bluevalue = 255
redvalue = 255
for j in range(h):
    for i in range(w):
        dist = cv2.pointPolygonTest(cnt, (i, j), True)
        if dist > 127:
            dist = 127
        
        if dist < -127:
            dist = -127
        
        if dist > 0:
            colorshow = (255 - dist * 2, 255 - dist * 2, 0)
        elif dist < 0:
            colorshow = (0, 255 + dist * 2, 255 + dist * 2)
        elif dist == 0:
            colorshow = (255, 255, 255)
        
        cv2.circle(polygonTestImg, (i, j), 2, colorshow, 2)

cv2.imshow('convexHullImg', convexHullImg)
cv2.imshow('polygonTestImg', polygonTestImg)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

# 测试形状匹配
import cv2
import numpy as np 

img1 = cv2.imread('star.png', 0)
img2 = cv2.imread('box.png', 0)
img3 = cv2.imread('testfit.png', 0)

ret1, thresh1 = cv2.threshold(img1, 127, 255, cv2.THRESH_BINARY)
ret2, thresh2 = cv2.threshold(img2, 127, 255, cv2.THRESH_BINARY)
ret3, thresh3 = cv2.threshold(img3, 127, 255, cv2.THRESH_BINARY)

con1, hir1 = cv2.findContours(thresh1, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
con2, hir2 = cv2.findContours(thresh2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
con3, hir3 = cv2.findContours(thresh3, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

cnt1 = con1[0]
cnt2 = con2[0]
cnt3 = con3[0]

ret12 = cv2.matchShapes(cnt1, cnt2, cv2.CONTOURS_MATCH_I2, 0.0) 
ret13 = cv2.matchShapes(cnt1, cnt3, cv2.CONTOURS_MATCH_I2, 0.0)
ret23 = cv2.matchShapes(cnt2, cnt3, cv2.CONTOURS_MATCH_I2, 0.0)

print(ret12, ret13, ret23)


cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)

cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

0.05888818307213595 0.2987404256696341 1.6190198650037022

【接口】

  • convexityDefects
void cv::convexityDefects	(	InputArray 	contour,
InputArray 	convexhull,
OutputArray 	convexityDefects 
);
cv2.convexityDefects(	contour, convexhull[, convexityDefects]	) ->	convexityDefects

计算查找一个轮廓的凸性缺陷

  • contour: 输入的轮廓
  • convexhull: 轮廓的凸包,用 convexHull
  • convexityDefects: 凸性缺陷输出向量, 每个缺陷是 4个整型元素的 vector。
  • pointPolygonTest
double cv::pointPolygonTest	(	InputArray 	contour,
Point2f 	pt,
bool 	measureDist 
);
cv2.pointPolygonTest(	contour, pt, measureDist	) ->	retval

判断一个点是否在轮廓内或边缘上,计算其距离;正数在内部,负数在外部;
如果 measureDist=false 则返回 1, -1, 0

  • contour: 输入的轮廓
  • pt: 测试点
  • measureDist: 如果为真,则计算距离,否则不用计算,只判断是否在内部还是外部;
  • matchShapes
double cv::matchShapes	(	InputArray 	contour1,
InputArray 	contour2,
int 	method,
double 	parameter 
);
cv2.matchShapes(	contour1, contour2, method, parameter	) ->	retval

比较两个形状

  • contour1: 第一个轮廓
  • contour2: 第二个轮廓
  • method: 比较的方法 见下 ShapeMatchModes
  • parameter: 方法的特殊参数(暂时不支持)
  • ShapeMatchModes

在这里插入图片描述

【参考】

  1. OpenCV官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

契约锁电子签助力拍卖业务网上签约,保全证据、不可抵赖,成交快

近年&#xff0c;二手车、房产、股权、数字藏品以及法律诉讼资产的拍卖&#xff0c;逐步从线下向线上转型。电子签章技术的应用&#xff0c;解决了委托拍卖合同、竞买合同以及成交确认书等文件线上签署难题&#xff0c;帮助拍卖机构建立全程数字化的“网上拍卖”渠道&#xff0…

Java本地搭建宝塔部署实战springboot智慧物业管理源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套基于若依开发的springboot智慧物业管理系统的源码&#xff0c;系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术架构 技术框架&#xff1a;SpringBoot…

5G工业互联网的“下半场”该拼什么?

据工信部11月21日最新发布的《2022年1-10月份通信业经济运行情况》显示&#xff0c;截止10月末&#xff0c;国内5G基站总数已达到225万个&#xff0c;占全球5G基站数比例超70%。截止今年8月末&#xff0c;国内已提前完成全年建成200万个5G基站的目标。中国在5G网络建设、终端普…

Echarts-实现3D柱状图显示,并单个柱子变色

如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>模拟3D柱状图渐变色柱子</title><scripttype"text/javascript"src"https://cdn.jsdelivr.net/npm/echarts5/dist/echarts.min.…

java每一练(3)

java每日一练(3) 单选部分 &#xff1a; 1.以下代码运行输出的是 public class Person{private String name "Person";int age0; }class Child extends Person{public String grade;public static void main(String[] args){Person p new Child();System.out.pri…

JavaWeb之Maven学习

目录Maven 简介仓库的分类Maven 坐标Maven 常用命令Maven 生命周期依赖管理删除Maven 项目导入项目最后Maven 简介 Maven的作用&#xff1a; Maven是专门用于管理和构建Java项目的工具 它的主要功能有&#xff1a; 提供了一套标准化的项目结构 提供了一套标准化的构建流程…

sqli-labs/Less-60

这一关还是一如既往的5次机会 一如既往的是以id作为注入点的 我们还是按照先前的做法第一轮先去获取一下注入类型以及决定下一轮要使用的注入方法 第二轮在进行各种爆破操作 首先输入id1 and 12判断注入类型是否属于数字型 回显如下 属于字符型 然后输入1 回显如下 说明不属于…

看世界杯效应下的中东市场,开发攻略来了

卡塔尔世界杯正如火如荼开展中&#xff0c;作为首次在中东地区举办的世界杯&#xff0c;它吸引了全世界目光的同时&#xff0c;也带来了一大波消费和需求。 先看一则新闻&#xff0c;在11月22日晚&#xff0c;沙特队在卡塔尔世界杯首战上演惊天大逆转&#xff0c;以2比1击败夺…

深入浅出DDD编程

作者 | 刘嘿嘿、离夏、立羽 导读 最近几年&#xff0c;微服务拆分大行其道&#xff0c;在业务越来越复杂的情况下&#xff0c;许多业务纷纷抛弃了传统单体架构&#xff0c;拥抱微服务。但随着微服务的拆分结束&#xff0c;大家又发现了新的问题&#xff0c;比如服务间逻辑复杂&…

计算机毕业设计之java+ssm峰值预警停车场管理系统

项目介绍 随着城市建设与经济的不断发展,城市车辆的数量也不断增涨,为解决停车问题修建停车场。基于经营、安全、管理等多角度的考虑&#xff0c;希望在目前传统的大型车库管理系统中有机地结合车牌识别技术&#xff0c;以求得日后在停车库运营时更安全、管理上更细致、经营中…

SuperMap 云原生常见问题解决办法-keycloak启动异常

有些客户在使用iManager for K8S 云套件的产品的时候&#xff0c;偶尔会遇到机器异常重启的情况&#xff0c;比如说服务器断电&#xff0c;重启后可能会出现云套件启动异常的情况&#xff0c;比如说keycloak启动不了&#xff0c;一直抛出异常导致服务无法正常使用。本篇文章就结…

MongoDB故障转移案例详细操作

MOngoDB故障转移 文章目录MOngoDB故障转移1.数据库提权操作1.1.使用命令查询主库信息1.2.给db02升级权重1.3.修改完成后进行加载配置1.4.主库执行降级操作2.恢复主库权限2.1.先给库权重降低2.2.执行降级命令2.3.恢复成功MongoDB的主从目前是我们在配置副本集的时候设置但是如果…

强化深度学习中使用Dyna-Q算法确定机器人问题中不同规划的学习和策略实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留下QQ并且私信~~~ 一、模型、学习、规划简介 1&#xff1a;模型 Agent可以通过模型来预测环境并做出反应&#xff0c;这里所说的模型通常指模拟模型&#xff0c;即在给定一个状态和动作时&#xff0c;通过模型可以对下一状态和奖赏做出预测 …

学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计 汉语言文学设计题材网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

在Postman中使用 FineBI提供的接口获取数据

FineBI 通过各种样式如表格、图表等来呈现数据&#xff0c;进行统计分析。 FineBI 是 B/S 架构的纯 Java 软件。 这些数据表格或图表&#xff0c;用户在开发系统的时候也可以自己编程来实现&#xff0c;FineBI也提供了相应的接口。 在Postman中使用 FineBI提供的接口获取数据…

数据可视化软件使用

一 前言 数据可视化平台是通过三维表示技术来表达复杂的信息&#xff0c;实现海量数据的立体体现。可视化技术借鉴人脑的视觉显示能力&#xff0c;通过挖掘重要数据之间的关系&#xff0c;揭示数据中隐藏的关联和发展趋势&#xff0c;从而提高数据的使用效率。可视化平台使人们…

在这个艰难的环境下,我裸辞了

2022年&#xff0c;疫情期间&#xff0c;工作了22年的我&#xff0c;从软件研发管理的相关工作中&#xff0c;辞职创业&#xff0c;开启我的独立咨询顾问生涯。很多人不解和迷惑&#xff0c;也有朋友关切的询问我的近况&#xff0c;就差用手来摸我的额头以判断我是否发烧了。因…

[附源码]SSM计算机毕业设计江苏人才信息管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

.net----委托和事件

委托和事件委托声明实例化调用将类型安全的函数指针(方法)作为其他方法的参数进行传递&#xff0c;从而实现函数回调方法委托&#xff1a;匿名方法委托多播委托委托&#xff1a;委托的异步调用委托&#xff1a;委托的兼容性事件事件实际上是委托的一种特殊形式&#xff0c;C#使…

软考-系统架构师-计算机与网络基础知识-数据库系统基础知识

文章目录1.关系数据库基础1.1关系型数据库基础1.1.1数据库的结构与模式1.1.2实体联系E-R模型1.1.3数据的规范化1.1.4事务管理1.1.5并发控制1.1.6数据库的备份和恢复2.关系数据库设计2.1数据库设计的特点2.2数据库的设计方法2.3数据库设计的基本步骤3.分布式数据库系统3.1分布式…