码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • opencv 判断点在多边形内外


            基于Python 和 OpenCV 画出多边形,以及判断某个点是不是在多边形内。

    1、cv2.pointPolygonTest() 函数

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

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

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

    测试用例:

    1. import cv2
    2. mask = cv2.imread(r"mask.jpg", 0)
    3. mask[mask > 100] = 255
    4. mask[mask != 255] = 0
    5. cnts, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    6. print("mask info:", mask.shape, len(cnts))
    7. pt0 = (131, 104) # 外点, 红色
    8. pt1 = (166, 157) # 轮廓上的点
    9. pt2 = (260, 170) # 内点
    10. img = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
    11. img = cv2.circle(img, pt0, 2, (0, 0, 255), 2) # 红色
    12. img = cv2.circle(img, pt1, 2, (0, 255, 0), 2) # 绿色
    13. img = cv2.circle(img, pt2, 2, (255, 0, 0), 2) # 蓝色
    14. dst0 = cv2.pointPolygonTest(cnts[0], pt0, 1)
    15. dst1 = cv2.pointPolygonTest(cnts[0], pt1, 1)
    16. dst2 = cv2.pointPolygonTest(cnts[0], pt2, 1)
    17. print("dst:", dst0, dst1, dst2)
    18. 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),则多边形就不闭合。

    示例代码:

    1. import cv2
    2. import numpy as np
    3. # 纯白图像
    4. img = np.zeros((500, 500, 3), np.uint8)
    5. img[:] = [255, 255, 255]
    6. # 四个顶点坐标
    7. pts = np.array([[100, 100], [200, 20], [370, 6], [450, 200]], np.int32)
    8. # 顶点个数:4,矩阵变成4*1*2维
    9. pts = pts.reshape((-1, 1, 2)) # (4,1,2)
    10. cv2.polylines(img, [pts], isClosed=True, color=(0, 0, 255), thickness=3)
    11. cv2.imwrite(r"a.jpg", img)

    结果:

    3、关键代码

    1. # 四个顶点坐标
    2. pts = np.array([[100, 100], [200, 20], [370, 6], [450, 200]], np.int32)
    3. # 顶点个数:4,矩阵变成4*1*2维
    4. pts = pts.reshape((-1, 1, 2)) # (4,1,2)
    5. # 画多边形
    6. img = cv2.polylines(img, [pts], isClosed=True, color=(0, 0, 255), thickness=3)
    7. # 测试点与多边形的距离
    8. 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

  • 相关阅读:
    【FPGA教程案例47】图像案例7——基于FPGA的RGB图像转化为灰度图实现,通过MATLAB进行辅助验证
    [机缘参悟-58]:《素书》-5-奉行仁义[遵义章第五]
    asp.net电影院选座系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
    10月业务安全月报 | 美国将奇虎360和知道创宇列入黑名单;丰田泄露30万用户信息;苹果曝严重漏洞
    AspNetCore开源中间件-VueRouterHistory
    ASP.NET Core3.1 API 创建(Swagger配置、数据库连接Sql Server)、开发、部署
    ArcGIS Pro SDK 002 对数据文件的读取和操作
    动态规划: dp+递推——确定动态矩阵dp含义,确定每个状态下面临的选择和对结果值影响,选择符合题意的作为结果存储在dp中
    【Redis】共同关注列表与基于Feed流的关注消息滚动分页推送的实现
    Java:修改Jar的源码,并上传Nexus私有仓库,替换jar版本
  • 原文地址:https://blog.csdn.net/weixin_34910922/article/details/125610396
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号