基于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 判断点在多边形内外相关推荐

  1. 判断点在多边形内外的简单算法

    发信人: RovingCloud (寻找当年的OI感觉), 信区: ACMICPC 标  题: [原创]惊喜发现判断点在多边形内外的超简单算法 发信站: 逸仙时空 Yat-sen Channel (W ...

  2. HDU1756(判断点在多边形内外)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1756 bool IsOnline(Point p,Segment s) /** 判断点p是否在线段s上 * ...

  3. 点在多边形内外的判断【计算几何】

    点在多边形内外的判断有两种处理方法:射线法和转角法 一.射线法: 从这一点出发,引向无穷远点的一条射线,根据交点情况确定点的位置 特点:特殊情况不易处理 以要判断的点为起点,任做一条射线,计算该射线与 ...

  4. opencv判断两个是否相等_openCV学习pointPolygonTest()

    看opencv文档的时候,看到opencv可以判断点是否在多边形内部,去搜了下怎么做到的,如下链接 https://www.cnblogs.com/anningwang/p/7581545.html​ ...

  5. php之判断点在多边形内的api

    1.判断点在多边形内的数学思想:以那个点为顶点,作任意单向射线,如果它与多边形交点个数为奇数个,那么那个点在多边形内,相关公式: <?php class AreaApi{//$area是一个多边 ...

  6. 辐角原理判断点和多边形的关系

    辐角判断点和多边形的关系 一.辐角原理 二.适用条件 三.算法效果 四.matlab代码实现 \qquad标题写的多边形,然而在现实情况中多边形只是该问题的一个子集:我们先讲点和连通域的关系,点和多边 ...

  7. Python+OpenCV判断图像是黑底还是白底

    前言 本篇博客使用Python+OpenCV判断图像是黑底还是白底,利用图像对角线上的黑白像素点个数进行判断,详情见下文. 本篇博客内容包含代码逻辑.说明.依赖.实现,这几部分.代码实现部分包含2种实 ...

  8. 判断点集与多边形的位置关系

    判断点集与多边形的位置关系 点集与凸多边形 点集与一般性多边形 点集与凸多边形 点集或者是点与多边形位置关系无非就三种 点在多边形的内部 点在多边形的外部 点在多边形上 一般如果该多边形是凸的那么我们 ...

  9. 判断点与多边形的关系(1):向量积法

    判断点与多边形的关系,是计算几何的经典问题,点与多边形的关系可以分为:点在多边形内(inside).点在多边形外(outside)以及点在多边形的边上(onside)三种. 在图像处理系统中,如果通过 ...

最新文章

  1. 线性回归和逻辑回归的区别_线性回归
  2. 神奇的marquee--滚动的文字
  3. Python--简单的目录扫描脚本
  4. 通过配置文件避免硬编码的一个例子
  5. ELF 动态链接 so的动态符号表(.dynsym)
  6. latex 生成中文目录乱码问题解决
  7. 《Linux KVM虚拟化架构实战指南》——第1章 KVM虚拟化概述 1.1XEN虚拟化介绍
  8. 刷题总结——Human Gene Functions(hdu1080)
  9. Client-Side UI Automation Provider - WinForm Sample
  10. WPF中自定义MarkupExtension
  11. MCGS 昆仑通态触摸屏 modbus TCP 数据转发
  12. MyBatis 大于小于符号表示
  13. Centos6.5安装后,网络连接显示红叉
  14. python将列表中的偶数变成平方、奇数不变_编写程序,将列表s=[9,7,8,3,2,1,5,6]中的偶数变成它的平方,奇数保持不变,运行效果如书上图所示。_学小易找答案...
  15. 网络架构及其演变过程(BS和CS区别)
  16. 【小程序基础】小程序内置组件
  17. linux查看日历命令_在Linux中使用命令行日历和日期功能
  18. 毕业设计 嵌入式 智能门禁系统
  19. echarts中中国地图的显示
  20. Java基础-- if else语句入门小练习

热门文章

  1. 根据地理位置获取经纬度
  2. 小程序webview应用实践
  3. HUAWEI华为MateBook X Pro 2020 i7 16GB+512GB (MACHC-WAE9LP)原装出厂系统恢复原厂系统(送解压密码)
  4. 科学研究:青少年熬夜更易产生反社会行为,还会延缓大脑发育
  5. 如何快速拷贝整个网站所有网页
  6. 【区块链论文整理】SIGMOD 篇 (二)
  7. TypeError: ctor is not a constructor报错
  8. 台式计算机强制关机,台式电脑强制关机按什么键
  9. 如何提升自己的宣传效果?从这两个点开始
  10. 纯CSS实现图片百叶窗展示效果