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

OpenCV结构分析与形状描述符(23)确定一个点是否位于多边形内的函数pointPolygonTest()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

进行点在轮廓内的测试。
该函数确定点是在轮廓内、轮廓外,还是位于一条边上(或与顶点重合)。它返回正值(内部)、负值(外部),或零值(在一条边上)。当 measureDist=false 时,返回值分别是 +1(内部)、-1(外部)和 0(在一条边上)。否则,返回值是从点到最近轮廓边的带符号距离。
下面是一个函数样本输出,其中每个图像像素都经过了轮廓测试:
在这里插入图片描述

函数原型


double cv::pointPolygonTest	
(InputArray 	contour,Point2f 	pt,bool 	measureDist 
)		

参数

  • 参数contour 输入的轮廓。
  • 参数pt 要测试的点。
  • 参数measureDist 如果为 true,则函数估计点到最近轮廓边缘的带符号距离。否则,函数只检查点是否在轮廓内部。

返回值

  • 当 measureDist=false 时,返回值是:
    • +1:如果点在轮廓内部。
    • -1:如果点在轮廓外部。
    • 0:如果点在轮廓的边上或与顶点重合。
  • 当 measureDist=true 时,返回值是从点到最近轮廓边的带符号距离。距离为正表示点在轮廓内部,距离为负表示点在轮廓外部,距离为零表示点在轮廓边上或与顶点重合。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 创建一个空白的图像cv::Mat image = cv::Mat::zeros( 300, 300, CV_8UC3 );// 创建一个示例轮廓std::vector< cv::Point > contour;contour.push_back( cv::Point( 100, 100 ) );contour.push_back( cv::Point( 200, 100 ) );contour.push_back( cv::Point( 200, 200 ) );contour.push_back( cv::Point( 100, 200 ) );// 绘制轮廓std::vector<std::vector<cv::Point>> contours(1, contour);cv::drawContours(image, contours, 0, cv::Scalar(0, 255, 0), 2);  // 在三通道图像的第一个轮廓上绘制绿色线条// 显示原始图像cv::imshow( "Original Image", image );// 创建一个掩码图像cv::Mat mask = cv::Mat::zeros(  image.size(), CV_8UC1 );// 遍历每个像素并测试其位置for ( int y = 0; y < image.rows; ++y ){for ( int x = 0; x < image.cols; ++x ){cv::Point2f pixel( x, y );float result = cv::pointPolygonTest( contour, pixel, false );if ( result >= 0 ){mask.at< uchar >( y, x ) = 255;  // 内部 如果点在轮廓内部,则在掩码图像上标记为白色(255)。}else{mask.at< uchar >( y, x ) = 125;  // 内部}}}// 显示掩码图像cv::imshow( "Mask Image", mask );cv::waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

相关文章:

  • Oracle数据库中的Oracle Label Security是什么
  • 好用的视频压缩工具有哪些?这4款千万不要错过
  • 15.4 prometheus使用的ClusterRole等RBAC对象
  • 算法练习题24——查找杨辉三角中的组合数
  • 另类动态规划
  • dplyr、tidyverse和ggplot2初探
  • CX_SY_RANGE_OUT_OF_BOUNDS
  • 外包干了三年,快要废了。。。
  • jQuery UI API 文档
  • RISC-V交叉编译器下载
  • eureka服务开启之后的默认登录账号密码是什么?
  • 高德地图绘图,点标记,并计算中心点
  • Leetcode面试经典150题-141.环形链表
  • 官宣:Zilliz 在亚马逊云科技中国区正式开服!
  • EA橘子平台Origin离线安装包获取
  • 收藏网友的 源程序下载网
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [nginx文档翻译系列] 控制nginx
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • co.js - 让异步代码同步化
  • Django 博客开发教程 8 - 博客文章详情页
  • ECS应用管理最佳实践
  • express如何解决request entity too large问题
  • Java 最常见的 200+ 面试题:面试必备
  • 笨办法学C 练习34:动态数组
  • 初识 beanstalkd
  • 关于extract.autodesk.io的一些说明
  • 猴子数据域名防封接口降低小说被封的风险
  • 记录一下第一次使用npm
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 深入浏览器事件循环的本质
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 学习使用ExpressJS 4.0中的新Router
  • 一个JAVA程序员成长之路分享
  • 用quicker-worker.js轻松跑一个大数据遍历
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 数据结构
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • (003)SlickEdit Unity的补全
  • (备份) esp32 GPIO
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转) Android中ViewStub组件使用
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET C# 操作Neo4j图数据库
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .NET6实现破解Modbus poll点表配置文件
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET单元测试
  • .vue文件怎么使用_vue调试工具vue-devtools的安装