python opencv 判断点是否在区域内——cv2.pointPolygonTest()

该文介绍了如何使用OpenCV中的cv2.pointPolygonTest()函数来检测图像中的点相对于轮廓的位置,包括点在轮廓内、外或轮廓上的情况。文章提供了示例代码,展示了一个鼠标点击事件,用于判断点击的点是否在指定的多边形区域内,并用不同颜色标记结果。
Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

👨‍💻个人简介: 深度学习图像领域工作者
🎉总结链接:
             链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括:
                    📌1.工作中常用深度学习脚本
                    📌2.torch、numpy等常用函数详解
                    📌3.opencv 图片、视频等操作
                    📌4.个人工作中的项目总结(纯干活)
              链接: https://blog.csdn.net/qq_28949847/article/details/128552785
🎉视频讲解: 以上记录,通过B站等平台进行了视频讲解使用,可搜索 ‘Python图像识别’ 进行观看
              B站:Python图像识别
              抖音:Python图像识别
              西瓜视频:Python图像识别


超链接:B站对此代码进行了讲解


1、cv2.pointPolygonTest() 函数

函数定义:
cv2.pointPolygonTest(contour, pt, measureDist)

函数功能:
找到图像里的点和轮廓之间的最短距离. 它返回的距离当点在轮廓外的时候是负值,当点在轮廓内是正值,如果在轮廓上是0。

参数:
contour :轮廓多边形
pt :坐标点
measureDist:若为True,返回带符号的距离;若为False,会找点是否在内,外,或轮廓上(相应返回+1, -1, 0)。

注意:
contour 传入的是np格式的数据

示例代码:

import cv2
import numpy as np


def onmouse_pick_points(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print('x = %d, y = %d' % (x, y))
        # 判断点是否在区域内
        flag = cv2.pointPolygonTest(pts, (x, y), False)
        if flag >= 0:
            color = (0, 255, 0)
        else:
            color = (0, 0, 255)
        cv2.drawMarker(param, (x, y), color)


if __name__ == '__main__':
    WIN_NAME = 'pick_points'
    #  凸形状区域
    # pts = np.array([[25, 70], [25, 160],
    #                 [110, 200], [200, 160],
    #                 [200, 70], [110, 20]],
    #                np.int32)
    # 凹形状
    pts = np.array([[100, 100], [400, 100],
                    [400, 200], [150, 200],
                    [150, 450], [400, 450],
                    [400, 550], [100, 550]],
                   np.int32)

    pts = pts.reshape((-1, 1, 2))
    image = np.zeros((800, 800, 3), np.uint8)
    cv2.namedWindow(WIN_NAME, 0)
    cv2.setMouseCallback(WIN_NAME, onmouse_pick_points, image)
    cv2.polylines(image, [pts], True, (255, 255, 255), 3)

    while True:
        cv2.imshow(WIN_NAME, image)
        key = cv2.waitKey(1)
        if key == 27:
            break
    cv2.destroyAllWindows()

效果展示:
凹形状区域,红色十字架代表在区域外,绿色代表在区域内
在这里插入图片描述
凸形状区域:
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python图像识别

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值