当前位置:网站首页>opencv 判断点在多边形内外
opencv 判断点在多边形内外
2022-07-05 22:17:00 【alex1801】
基于Python 和 OpenCV 画出多边形,以及判断某个点是不是在多边形内。
1、cv2.pointPolygonTest() 函数
函数定义:cv2.pointPolygonTest(contour, pt, measureDist)
函数功能:找到图像里的点和轮廓之间的最短距离. 它返回的距离当点在轮廓外的时候是负值,当点在轮廓内是正值,如果在轮廓上是0。
其中,contour 为轮廓多边形;pt 为坐标点;measureDist, 若为True,是找带符号的距离;若为False,会找点是否在内,外,或轮廓上(相应返回+1, -1, 0)。
测试用例:
import cv2
mask = cv2.imread(r"mask.jpg", 0)
mask[mask > 100] = 255
mask[mask != 255] = 0
cnts, _ = 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专栏
边栏推荐
- Oracle triggers
- Implementation technology of recovery
- 极狐公司官方澄清声明
- [Yugong series] go teaching course in July 2022 004 go code Notes
- MySQL actual combat 45 lecture learning (I)
- Recovery technology with checkpoints
- 2022软件测试工程师涨薪攻略,3年如何达到30K
- K210学习笔记(四) K210同时运行多个模型
- When the industrial Internet era is truly mature, we will look at the emergence of a series of new industrial giants
- The American Championship is about to start. Are you ready?
猜你喜欢

Index optimization of performance tuning methodology

Nacos 的安装与服务的注册

boundary IoU 的计算方式

【愚公系列】2022年7月 Go教学课程 003-IDE的安装和基本使用

Official clarification statement of Jihu company

EBS Oracle 11g cloning steps (single node)

IIC bus realizes client device

Livelocks and deadlocks of concurrency control

Three "factions" in the metauniverse

What about data leakage? " Watson k'7 moves to eliminate security threats
随机推荐
How to use tensorflow2 for cat and dog classification and recognition
Summary of concurrency control
Two stage locking protocol for concurrency control
Technology cloud report: how many hurdles does the computing power network need to cross?
Some tutorials install the database on ubantu so as not to occupy computer memory?
Analyse des risques liés aux liaisons de microservices
Reptile practice
等到产业互联网时代真正发展成熟,我们将会看待一系列的新产业巨头的出现
How to reverse a string fromCharCode? - How to reverse String. fromCharCode?
344. Reverse String. Sol
Overview of concurrency control
Shell script, awk uses if, for process control
Cobaltstrike builds an intranet tunnel
Pl/sql basic case
2022软件测试工程师涨薪攻略,3年如何达到30K
CA certificate trampled pit
The simple problem of leetcode is to split a string into several groups of length K
Platformio create libopencm3 + FreeRTOS project
Blocking of concurrency control
AD637使用筆記