当前位置: 首页 > news >正文

【python】OpenCV—Point Polygon Test

在这里插入图片描述

文章目录

  • 1、完整代码
  • 2、涉及到的库
    • cv2.pointPolygonTest
    • cv2.minMaxLoc

1、完整代码

from __future__ import print_function
from __future__ import division
import cv2 as cv
import numpy as np
# Create an image
r = 100
src = np.zeros((4*r, 4*r), dtype=np.uint8)
# 创建六边形的6个顶点
vert = [None]*6
vert[0] = (3*r//2, int(1.34*r))
vert[1] = (1*r, 2*r)
vert[2] = (3*r//2, int(2.866*r))
vert[3] = (5*r//2, int(2.866*r))
vert[4] = (3*r, 2*r)
vert[5] = (5*r//2, int(1.34*r))
# 根据六个顶点画6边形
for i in range(6):cv.line(src, vert[i],  vert[(i+1)%6], ( 255 ), 3)
# 获取六边形的轮廓
contours, _ = cv.findContours(src, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
# 计算图上点到六边形的距离(带符号)
raw_dist = np.empty(src.shape, dtype=np.float32)
for i in range(src.shape[0]):for j in range(src.shape[1]):raw_dist[i,j] = cv.pointPolygonTest(contours[0], (j,i), True)
# 查找带符号的最大最小值
minVal, maxVal, _, maxDistPt = cv.minMaxLoc(raw_dist)
minVal = abs(minVal)
maxVal = abs(maxVal)
# 用图形表示距离
drawing = np.zeros((src.shape[0], src.shape[1], 3), dtype=np.uint8)
for i in range(src.shape[0]):for j in range(src.shape[1]):if raw_dist[i,j] < 0:drawing[i,j,0] = 255 - abs(raw_dist[i,j]) * 255 / minValelif raw_dist[i,j] > 0:drawing[i,j,2] = 255 - raw_dist[i,j] * 255 / maxValelse:drawing[i,j,0] = 255drawing[i,j,1] = 255drawing[i,j,2] = 255
cv.circle(drawing,maxDistPt, int(maxVal),(255,255,255), 1, cv.LINE_8, 0)
cv.imshow('Source', src)
cv.imshow('Distance and inscribed circle', drawing)
cv.waitKey()

在这里插入图片描述
在这里插入图片描述

带符号的最大值,为六边形的中心,到六边形轮廓的距离最远

以此点位中心,画了个圆

六边形外的点,蓝色随着距离变大递减

六边形内的点,红色随着距离变大递减

六边形上的点,白色

2、涉及到的库

cv2.pointPolygonTest

用于判断一个点是否位于一个多边形内部、外部还是边上。这个函数在图像处理、计算机视觉和形状分析等领域中非常有用。以下是关于 cv2.pointPolygonTest() 函数的详细解析:

函数定义

cv2.pointPolygonTest(contour, pt, measureDist=False)
  • contour:输入的多边形轮廓,通常是一个由点构成的数组(numpy数组),这些点定义了多边形的边界。这些点可以通过如 cv2.findContours 等函数从图像中提取。
  • pt:需要检测的点,通常是一个包含 x 和 y 坐标的元组或 numpy.ndarray。
  • measureDist:一个布尔值参数,指定是否计算点到多边形边界的最短距离。
    1)如果为 True,则函数返回点到边界的带符号距离。当点在多边形内部时,距离为正;当点在多边形外部时,距离为负;当点在多边形边上时,距离为0。距离的绝对值表示点到多边形边界的实际最短距离。
    2)如果为 False(默认值),则函数返回一个整数,表示点相对于多边形的位置。返回值为 -1 表示点在多边形外部,0 表示点在多边形边上,+1 表示点在多边形内部。

使用场景

  • 形状分析:通过检测点是否在多边形内部,可以分析形状的属性和特征。
  • 物体检测:在图像处理中,可以检测物体边界框内的点是否在多边形内部,从而判断物体是否被完全包含在多边形内。
  • 图像分割:在图像分割任务中,可以使用该函数来判断像素点是否属于某个特定的区域或对象。

示例代码

import cv2  
import numpy as np  # 定义一个多边形的顶点  
pts = np.array([[0, 0], [100, 0], [100, 100], [0, 100]], np.int32)  
pts = pts.reshape((-1, 1, 2))  # 将点集转换为 (n, 1, 2) 的形状  # 待检测的点  
pt_inside = (50, 50)  # 多边形内部的一个点  
pt_on_edge = (100, 0)  # 多边形边上的一个点  
pt_outside = (150, 50)  # 多边形外部的一个点  # 调用 pointPolygonTest  
dist_inside = cv2.pointPolygonTest(pts, pt_inside, measureDist=True)  
dist_on_edge = cv2.pointPolygonTest(pts, pt_on_edge, measureDist=True)  
dist_outside = cv2.pointPolygonTest(pts, pt_outside, measureDist=True)  position_inside = cv2.pointPolygonTest(pts, pt_inside, measureDist=False)  
position_on_edge = cv2.pointPolygonTest(pts, pt_on_edge, measureDist=False)  
position_outside = cv2.pointPolygonTest(pts, pt_outside, measureDist=False)  print(f"Inside distance: {dist_inside}")  
print(f"On edge distance: {dist_on_edge}")  
print(f"Outside distance: {dist_outside}")  print(f"Inside position: {position_inside}")  
print(f"On edge position: {position_on_edge}")  
print(f"Outside position: {position_outside}")

output

Inside distance: 50.0
On edge distance: -0.0
Outside distance: -50.0
Inside position: 1.0
On edge position: 0.0
Outside position: -1.0

注意事项

  • 确保传入的轮廓(contour)是正确的,即它应该是一个由点构成的数组,这些点定义了多边形的边界。

  • 当 measureDist 为 True 时,返回的距离值是带符号的,正值表示点在多边形内部,负值表示在多边形外部,绝对值表示最短距离。

  • cv2.pointPolygonTest() 函数不会直接修改输入的图像或轮廓,它只是返回一个表示点位置的数值或距离。

cv2.minMaxLoc

用于寻找一维数值数组(例如,灰度图像的某一行或列)中的全局最小值和最大值,以及它们的位置。这个函数对于图像处理中的阈值设置、特征检测等场景非常有用。

cv2.minMaxLoc(src, mask=None)
  • src:输入的单通道数值数组。这可以是一个灰度图像,或者图像的某个部分(如一行或一列)。

  • mask:可选的与 src 同样大小和类型的操作掩码。如果提供了掩码,则函数仅在没有被掩码标记为忽略的元素中查找最小值和最大值。掩码中的非零值表示对应位置的元素需要考虑在内。

返回值

函数返回一个包含四个元素的元组 (minVal, maxVal, minLoc, maxLoc):

  • minVal:找到的最小值。
  • maxVal:找到的最大值。
  • minLoc:最小值的坐标(以元组形式给出,如 (x, y))。注意,对于一维数组(如图像的单个行或列),坐标将是 (col, 0),因为 y 坐标在这种情况下没有意义。
  • maxLoc:最大值的坐标(同样以元组形式给出)。

使用示例

import cv2  
import numpy as np  # 加载图像(转换为灰度,如果它还不是)  
img = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)  # 查找最小值和最大值以及它们的位置  
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(img)  print(f"Minimum value: {minVal}, at location: {minLoc}")  
print(f"Maximum value: {maxVal}, at location: {maxLoc}")

如果你只对图像的某一行或列感兴趣,你可以先通过索引该行或列来创建一个一维数组,然后再调用 cv2.minMaxLoc。

注意:对于二维图像(如灰度图像),返回的坐标 (x, y) 是以图像的左上角为原点((0, 0))的坐标系统。但是,对于一维数组(如通过索引得到的行或列),y 坐标总是 0,因为此时我们实际上是在处理一维数据。

相关文章:

【python】OpenCV—Point Polygon Test

文章目录 1、完整代码2、涉及到的库cv2.pointPolygonTestcv2.minMaxLoc 1、完整代码 from __future__ import print_function from __future__ import division import cv2 as cv import numpy as np # Create an image r 100 src np.zeros((4*r, 4*r), dtypenp.uint8) # 创…...

6 Go语言的常量、枚举、作用域

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;由浅入深讲解Go语言&#xff0c;希望大家都能够从中有所收获&#xff0c;也请大家多多支持。 查看相关资料与知识库 专栏地址:Go专栏 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;大家一起学习&#xff0c;…...

第十一章 数据结构

第十一章 数据结构 11.1 数组 数组是元素的顺序集合&#xff0c;通常这些元素具有相同的数据类型 索引表示元素在数组中的顺序号&#xff0c;顺序号从数组开始处计数 数组元素通过索引被独立给出了地址&#xff0c;数组整体上有一个名称&#xff0c;但每个元素利用数组的的…...

LeetCode704 二分查找

前言 题目&#xff1a; 704.二分查找 文档&#xff1a; 代码随想录——二分查找 编程语言&#xff1a; C 解题状态&#xff1a; 解答错误&#xff0c;变量定义位置错误。 思路 有序数组的查找&#xff0c;最直接的思路应该就是二分查找。但是在查找的过程中要考虑到区间的边界…...

[言简意赅] Matlab生成FPGA端rom初始化文件.coe

&#x1f38e;Matlab生成FPGA端rom初始化文件.coe 本文主打言简意赅。 函数源码 function gencoeInitialROM(width, depth, signal, filepath)% gencoeInitialROM - 生成 Xilinx ROM 初始化格式的 COE 文件%% 输入参数:% width - ROM 数据位宽% depth - ROM 数据深度% s…...

【QAC】分布式部署下其他机器如何连接RLM

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描&#xff0c;必须先连接RLMLicense管理器&#xff0c;如何连接&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2、机器环境…...

从等保测评看行业安全趋势:洞察与预测

在当今数字化时代&#xff0c;网络安全已成为各行各业的头等大事。等保测评&#xff08;等级保护测评&#xff09;&#xff0c;作为国家对信息系统安全的重要管理手段&#xff0c;不仅关乎企业的合规性&#xff0c;更是行业安全水平的重要衡量标准。本文将从等保测评的视角出发…...

HTTP模块(二)

HTTP 设置 HTTP 响应报文 HTTP报文常见属性&#xff1a; const http require(http);const server http.createServer((request, response) > {// 设置请求状态码 2xx 4xx 5xxresponse.statusCode 200;// 设置请求描述 了解即可response.statusMessage hello// 指定响…...

引入缓存带来的问题以及解决方案

目录 前言 问题与解决方案 缓存击穿 缓存穿透 缓存雪崩 缓存一致性 前言 在提升接口性能的方案中&#xff0c;毫无疑问&#xff0c;使用缓存是最有效果的&#xff0c;但同时也会带来新的问题。 缓存击穿缓存穿透缓存雪崩缓存一致性 以上问题都是引入缓存需要考虑的&am…...

力扣39题:组合总和的 Java 实现

引言 力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;提供了大量的编程题目供开发者练习。第39题“组合总和”是一个经典的回溯算法问题&#xff0c;要求找出所有可能的组合&#xff0c;使得组合中的数字之和等于给定的目标值。本文将介绍如何使用 Java …...

使用el-table实现自动滚动

文章目录 概要技术实现完整代码 概要 在前端开发大屏的时候&#xff0c;我们会用到表格数据展示&#xff0c;有时候为了使用户体验更加好&#xff0c;会增加表格自动滚动。下边我将以示例代码&#xff0c;用element UI的el-table来讲一下。 技术实现 1 .增加dom监听&#xf…...

Angular由一个bug说起之八:实践中遇到的一个数据颗粒度的问题

互联网产品离不开数据处理&#xff0c;数据处理有一些基本的原则包括&#xff1a;准确性、‌完整性、‌一致性、‌保密性、‌及时性。‌ 准确性&#xff1a;是数据处理的首要目标&#xff0c;‌确保数据的真实性和可靠性。‌准确的数据是进行分析和决策的基础&#xff0c;‌因此…...

day13(DNS域名解析)

今天内容&#xff1a; 1、逆向解析 2、多域名 3、时间服务器 4、主从配置 1.设置逆向解析 &#xff08;1&#xff09;永久配置我们自己的DNS服务器 &#xff08;2&#xff09;关闭NetworkManager服务 NetworkManager 的自动管理功能可能会干扰定制化的网络配置。 在需要切换…...

uboot的mmc partconf命令

文章目录 命令格式参数解释具体命令解释总结 mmc partconf 是一个用于配置 MMC (MultiMediaCard) 分区的 U-Boot 命令。具体来说&#xff0c;这个命令允许你设置或读取 MMC 卡的分区配置参数。让我们详细解释一下 mmc partconf 0 0 1 0 命令的含义。 命令格式 mmc partconf &…...

数据结构经典测题3

1. 设有定义&#xff1a; char *p; &#xff0c;以下选项中不能正确将字符串赋值给字符型指针 p 的语句是【多选】&#xff08; &#xff09; A: pgetchar(); B: scanf("%s",p); C: char s[]"china"; ps; D: *p"china"; 答案为ABD A选项&…...

tensorboard add_text() 停止自动为尖括号标记添加配对的结束括号</>

问题 调用tensorboard的add_text()记录文本信息时&#xff0c;如果文本中含有含尖括号的标记&#xff0c;就会被自动识别为html标记&#xff0c;因此tensorboard会自动生成对应的带斜杠的结束标记。 例如要记录的文本是 abc<abc>&#xff0c;在tensorboard中就会显示为a…...

sql-libs通关详解

1-4关 1.第一关 我们输入?id1 看回显&#xff0c;通过回显来判断是否存在注入&#xff0c;以及用什么方式进行注入&#xff0c;直接上图 可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显&#xff0c;所以我们可以使用联合查询。联合查询原理简单说一下&…...

【STM32】当按键具有上拉电阻时GPIO应该配置什么模式?怎么用按键去控制LED翻转?

当按键具有上拉电阻时&#xff0c;可以通过正确配置STM32的GPIO端口和编写相应的控制代码来实现按键控制LED灯的功能。具体来说&#xff0c;需要配置按键所连接的GPIO端口为输入模式&#xff0c;并启用内部上拉电阻&#xff0c;这样在按键未操作时该端口保持高电平状态&#xf…...

EXO-chatgpt_api 解释

目录 chatgpt_api 解释 resolve_tinygrad_tokenizer 函数 resolve_tokenizer 函数 调试和日志记录​​​​​​​ 参数 返回值 初始化方法 __init__ 异步方法 注意事项 chatgpt_api 解释 展示了如何在一个项目中组织和导入各种库、模块和类,以及如何进行一些基本的We…...

新能源汽车的充电网络安全威胁和防护措施

1. 物理攻击&#xff1a;例如恶意破坏、搬走充电设施等&#xff0c;这可能会对充电设施造成损害&#xff0c;妨碍正常的电力传输。 2. 网络攻击&#xff1a; 黑客可能利用系统漏洞攻击网络&#xff0c;破坏设备&#xff0c;并窃取用户的个人信息、支付信息等&#xff1b; 车辆…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...