opencv 判断点在多边形内外
基于Python 和 OpenCV 画出多边形,以及判断某个点是不是在多边形内。
1、cv2.pointPolygonTest() 函数
函数定义:cv2.pointPolygonTest(contour, pt, measureDist)
函数功能:找到图像里的点和轮廓之间的最短距离. 它返回的距离当点在轮廓外的时候是负值,当点在轮廓内是正值,如果在轮廓上是0。
其中,contour 为轮廓多边形;pt 为坐标点;measureDist, 若为True,是找带符号的距离;若为False,会找点是否在内,外,或轮廓上(相应返回+1, -1, 0)。
测试用例:
import cv2mask = cv2.imread(r"mask.jpg", 0)
mask[mask > 100] = 255
mask[mask != 255] = 0cnts, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print("mask info:", mask.shape, len(cnts))pt0 = (131, 104) # 外点, 红色
pt1 = (166, 157) # 轮廓上的点
pt2 = (260, 170) # 内点
img = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
img = cv2.circle(img, pt0, 2, (0, 0, 255), 2) # 红色
img = cv2.circle(img, pt1, 2, (0, 255, 0), 2) # 绿色
img = cv2.circle(img, pt2, 2, (255, 0, 0), 2) # 蓝色dst0 = cv2.pointPolygonTest(cnts[0], pt0, 1)
dst1 = cv2.pointPolygonTest(cnts[0], pt1, 1)
dst2 = cv2.pointPolygonTest(cnts[0], pt2, 1)
print("dst:", dst0, dst1, dst2)
cv2.imwrite(r"ret.jpg", img)
测试结果:
dst: -58.52 2.82 44.28
图像:
2、cv2.polylines() 函数
函数定义:img = cv2.polylines(img, pts, isClosed, color, thickness, lineType, shift)
其中:
pts 是多边形定点构成的矩阵,将传入的点一次连接。
isClosed - 表示绘制的多边形是否闭合. 如闭合(True),则每个曲线的最后一个顶点到第一个顶点是连接的,若不闭合(False),则多边形就不闭合。
示例代码:
import cv2
import numpy as np# 纯白图像
img = np.zeros((500, 500, 3), np.uint8)
img[:] = [255, 255, 255]# 四个顶点坐标
pts = np.array([[100, 100], [200, 20], [370, 6], [450, 200]], np.int32)
# 顶点个数:4,矩阵变成4*1*2维
pts = pts.reshape((-1, 1, 2)) # (4,1,2)
cv2.polylines(img, [pts], isClosed=True, color=(0, 0, 255), thickness=3)
cv2.imwrite(r"a.jpg", img)
结果:
3、关键代码
# 四个顶点坐标
pts = np.array([[100, 100], [200, 20], [370, 6], [450, 200]], np.int32)# 顶点个数:4,矩阵变成4*1*2维
pts = pts.reshape((-1, 1, 2)) # (4,1,2)# 画多边形
img = cv2.polylines(img, [pts], isClosed=True, color=(0, 0, 255), thickness=3)# 测试点与多边形的距离
dist = cv2.pointPolygonTest(pts, (307, 100), True)
扩展阅读:
1、opencv python 轮廓/凸缺陷/PointPolygonTest/形状匹配
opencv python 轮廓/凸缺陷/PointPolygonTest/形状匹配 - SegmentFault 思否
形状匹配:
OpenCV附带了一个函数cv2.matchShapes(),它使我们能够比较两个形状或两个轮廓,并返回一个显示相似性的度量。 结果越低,匹配就越好.它是根据hu-moment值计算的。
ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
2、比好好的opencv专栏
https://blog.csdn.net/kakiebu/category_7398390.html
opencv 判断点在多边形内外相关推荐
- 判断点在多边形内外的简单算法
发信人: RovingCloud (寻找当年的OI感觉), 信区: ACMICPC 标 题: [原创]惊喜发现判断点在多边形内外的超简单算法 发信站: 逸仙时空 Yat-sen Channel (W ...
- HDU1756(判断点在多边形内外)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1756 bool IsOnline(Point p,Segment s) /** 判断点p是否在线段s上 * ...
- 点在多边形内外的判断【计算几何】
点在多边形内外的判断有两种处理方法:射线法和转角法 一.射线法: 从这一点出发,引向无穷远点的一条射线,根据交点情况确定点的位置 特点:特殊情况不易处理 以要判断的点为起点,任做一条射线,计算该射线与 ...
- opencv判断两个是否相等_openCV学习pointPolygonTest()
看opencv文档的时候,看到opencv可以判断点是否在多边形内部,去搜了下怎么做到的,如下链接 https://www.cnblogs.com/anningwang/p/7581545.html ...
- php之判断点在多边形内的api
1.判断点在多边形内的数学思想:以那个点为顶点,作任意单向射线,如果它与多边形交点个数为奇数个,那么那个点在多边形内,相关公式: <?php class AreaApi{//$area是一个多边 ...
- 辐角原理判断点和多边形的关系
辐角判断点和多边形的关系 一.辐角原理 二.适用条件 三.算法效果 四.matlab代码实现 \qquad标题写的多边形,然而在现实情况中多边形只是该问题的一个子集:我们先讲点和连通域的关系,点和多边 ...
- Python+OpenCV判断图像是黑底还是白底
前言 本篇博客使用Python+OpenCV判断图像是黑底还是白底,利用图像对角线上的黑白像素点个数进行判断,详情见下文. 本篇博客内容包含代码逻辑.说明.依赖.实现,这几部分.代码实现部分包含2种实 ...
- 判断点集与多边形的位置关系
判断点集与多边形的位置关系 点集与凸多边形 点集与一般性多边形 点集与凸多边形 点集或者是点与多边形位置关系无非就三种 点在多边形的内部 点在多边形的外部 点在多边形上 一般如果该多边形是凸的那么我们 ...
- 判断点与多边形的关系(1):向量积法
判断点与多边形的关系,是计算几何的经典问题,点与多边形的关系可以分为:点在多边形内(inside).点在多边形外(outside)以及点在多边形的边上(onside)三种. 在图像处理系统中,如果通过 ...
最新文章
- 线性回归和逻辑回归的区别_线性回归
- 神奇的marquee--滚动的文字
- Python--简单的目录扫描脚本
- 通过配置文件避免硬编码的一个例子
- ELF 动态链接 so的动态符号表(.dynsym)
- latex 生成中文目录乱码问题解决
- 《Linux KVM虚拟化架构实战指南》——第1章 KVM虚拟化概述 1.1XEN虚拟化介绍
- 刷题总结——Human Gene Functions(hdu1080)
- Client-Side UI Automation Provider - WinForm Sample
- WPF中自定义MarkupExtension
- MCGS 昆仑通态触摸屏 modbus TCP 数据转发
- MyBatis 大于小于符号表示
- Centos6.5安装后,网络连接显示红叉
- python将列表中的偶数变成平方、奇数不变_编写程序,将列表s=[9,7,8,3,2,1,5,6]中的偶数变成它的平方,奇数保持不变,运行效果如书上图所示。_学小易找答案...
- 网络架构及其演变过程(BS和CS区别)
- 【小程序基础】小程序内置组件
- linux查看日历命令_在Linux中使用命令行日历和日期功能
- 毕业设计 嵌入式 智能门禁系统
- echarts中中国地图的显示
- Java基础-- if else语句入门小练习