OpenCV4.9的点多边形测试(65)

news2024/12/23 13:40:05
返回:OpenCV系列文章目录(持续更新中......)
上一篇:OpenCV的图像矩(64)
下一篇:OpenCV4.9的基于距离变换和分水岭算法的图像分割(66)

Point Polygon Test(点多边形测试)是 OpenCV 库中的一个功能,用于判断一个点是否在一个多边形内部。它可以接受多种类型的多边形,例如凸多边形和非凸多边形,并且可以在 2D 或 3D 空间中使用。

Point Polygon Test 的工作原理很简单,它通过计算测试点到多边形边缘的距离,确定测试点与多边形之间的关系。如果测试点与多边形重合,则返回零。如果测试点在多边形内部,则返回正值。反之,如果测试点在多边形外部,则返回负值。

在计算机视觉和图像处理领域中,点多边形测试常用于对图像中的特定区域进行选取和分割,例如对目标物体的轮廓进行细分和拟合等。通过 Point Polygon Test,我们可以检测一个点是否在一个区域内,从而实现分割和细分等操作。

目标

在本教程中,您将学习如何:

  • 使用 OpenCV 函数 cv::pointPolygonTest

C++代码
 

本教程代码如下所示。您也可以从这里下载

#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
 
using namespace cv;
using namespace std;
 
int main( void )
{
 const int r = 100;
 Mat src = Mat::zeros( Size( 4*r, 4*r ), CV_8U );
 
 vector<Point2f> vert(6);
 vert[0] = Point( 3*r/2, static_cast<int>(1.34*r) );
 vert[1] = Point( 1*r, 2*r );
 vert[2] = Point( 3*r/2, static_cast<int>(2.866*r) );
 vert[3] = Point( 5*r/2, static_cast<int>(2.866*r) );
 vert[4] = Point( 3*r, 2*r );
 vert[5] = Point( 5*r/2, static_cast<int>(1.34*r) );
 
 for( int i = 0; i < 6; i++ )
 {
 line( src, vert[i], vert[(i+1)%6], Scalar( 255 ), 3 );
 }
 
 vector<vector<Point> > contours;
 findContours( src, contours, RETR_TREE, CHAIN_APPROX_SIMPLE);
 
 Mat raw_dist( src.size(), CV_32F );
 for( int i = 0; i < src.rows; i++ )
 {
 for( int j = 0; j < src.cols; j++ )
 {
 raw_dist.at<float>(i,j) = (float)pointPolygonTest( contours[0], Point2f((float)j, (float)i), true );
 }
 }
 
 double minVal, maxVal;
 Point maxDistPt; // inscribed circle center
 minMaxLoc(raw_dist, &minVal, &maxVal, NULL, &maxDistPt);
 minVal = abs(minVal);
 maxVal = abs(maxVal);
 
 Mat drawing = Mat::zeros( src.size(), CV_8UC3 );
 for( int i = 0; i < src.rows; i++ )
 {
 for( int j = 0; j < src.cols; j++ )
 {
 if( raw_dist.at<float>(i,j) < 0 )
 {
 drawing.at<Vec3b>(i,j)[0] = (uchar)(255 - abs(raw_dist.at<float>(i,j)) * 255 / minVal);
 }
 else if( raw_dist.at<float>(i,j) > 0 )
 {
 drawing.at<Vec3b>(i,j)[2] = (uchar)(255 - raw_dist.at<float>(i,j) * 255 / maxVal);
 }
 else
 {
 drawing.at<Vec3b>(i,j)[0] = 255;
 drawing.at<Vec3b>(i,j)[1] = 255;
 drawing.at<Vec3b>(i,j)[2] = 255;
 }
 }
 }
 circle(drawing, maxDistPt, (int)maxVal, Scalar(255,255,255));
 
 imshow( "Source", src );
 imshow( "Distance and inscribed circle", drawing );
 
 waitKey();
 return 0;
}

结果

在这里:


参考文献:

1、《Point Polygon Test》-----Ana Huamán

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1639176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows安装mysql8.0.20

目录 1.下载安装包mysql8.0.20 2.配置MySQL环境变量 3.开始安装 ​编辑4.打开cmd命令行 5.Navicat测试连接 1.下载安装包mysql8.0.20 MySQL :: Download MySQL Community Server (Archived Versions) 2.配置MySQL环境变量 3.开始安装 将压缩包安装到指定路径 编辑my.ini文件…

一起Talk Android吧(第五百五十八回:lombok用法)

文章目录 1. 概述2. 使用方法3. 内容总结 各位看官们大家好&#xff0c;上一回中介绍了如何获取文件读写权限的知识,本章回中将介绍lombok相关的知识。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&#xff01; 1. 概述 这是一个java库&#xff0c;用来…

[系统安全] 六十.威胁狩猎 (1)APT攻击检测及防御与常见APT组织的攻击案例分析

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

踏上R语言之旅:解锁数据世界的神秘密码(五)

线性与非线性模型及R使用 文章目录 线性与非线性模型及R使用一、数据的分类与模型选择1.变量的取值类型 二、广义线性模型广义线性模型概述Logistic模型 总结 一、数据的分类与模型选择 1.变量的取值类型 因变量记为y&#xff0c;解释变量记为x1&#xff0c;x2,… 因变量y一般…

Coursera: An Introduction to American Law 学习笔记 Week 05: Criminal Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 05: Criminal LawKey Criminal Law TermsSupplemental Re…

边沿JK触发器

边沿JK触发器 电路组成 & 逻辑符号 工作原理 Q n 1 D Q^{n1}D Qn1D J Q n ‾ K Q n ‾ \overline{\overline{JQ^n}KQ^n} JQn​KQn​ ( J Q n ) ( K ‾ Q n ‾ ) (JQ^n)(\overline{K}\overline{Q^n}) (JQn)(KQn​) J K ‾ J Q n ‾ K ‾ Q n Q n ‾ Q n J\over…

解救应用启动危机:Spring Boot的FailureAnalyzer机制

目录 一、走进FailureAnalyzer 二、在Spring Boot中如何生效 三、为什么可能需要自定义FailureAnalyzer 四、实现自定义基本步骤 &#xff08;一&#xff09;完整步骤要求 &#xff08;二&#xff09;注册方式说明 通过Spring Boot的spring.factories文件&#xff08;建…

Java中的字符流

字符流字节流编码表 Java为什么可以区分字母和汉字 package day3; ​ import java.io.UnsupportedEncodingException; import java.lang.reflect.Array; import java.util.Arrays; ​ public class Test {public static void main(String[] args) throws UnsupportedEncoding…

文件批量高效管理,批量将PDF类型文件移动到指定文件夹里,实现文件高效管理

文件的管理与整理成为了我们生活中不可或缺的一部分。面对堆积如山的PDF文件&#xff0c;你是否也曾感到手足无措、焦头烂额&#xff1f;现在&#xff0c;有了我们的批量文件管理工具&#xff0c;PDF文件的管理将变得前所未有的高效与简单&#xff01; 首先&#xff0c;我们要…

用龙梦迷你电脑福珑2.0做web服务器

用龙梦迷你电脑福珑2.0上做web服务器是可行的。已将一个网站源码放到该电脑&#xff0c;在局域网里可以访问网站网页。另外通过在同一局域网内的一台windows10电脑上安装花生壳软件&#xff0c;也可以在外网访问该内网服务器网站网页。该电脑的操作系统属于LAMP。在该电脑上安装…

Android 开发部分基础工具使用

c调试 在NDK调试的时候&#xff0c;如果找不到 符号的话&#xff0c;我们可以在调试配置中添加符号地址的全路径一直到根目录&#xff1a;&#xff0c;xxx/armeabi-v7a&#xff1a; You must point the symbol search paths at the obj/local/ directory. This is also not a …

C++奇迹之旅:C++内存管理的机制初篇

文章目录 &#x1f4dd;C/C内存分布&#x1f320; C语言中动态内存管理方式&#x1f309;C内存管理方式 &#x1f320;new/delete操作内置类型&#x1f309;C与C链表构建对比 &#x1f6a9;总结 &#x1f4dd;C/C内存分布 这是C/C中程序内存区域划分图&#xff1a; 数据段&am…

基于springboot+vue+Mysql的网上商城购物系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

蓝桥杯练习系统(算法训练)ALGO-951 预备爷的悲剧

资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 英语预备爷gzp是个逗(tu)比(hao)&#xff0c;为了在即将到来的英语的quiz中不挂科&#xff0c;gzp废寝忘食复习英语附录单词…

V23 中的新增功能:LEADTOOLS React Medical Web 查看器

LEADTOOLS (Lead Technology)由Moe Daher and Rich Little创建于1990年&#xff0c;其总部设在北卡罗来纳州夏洛特。LEAD的建立是为了使Daher先生在数码图象与压缩技术领域的发明面向市场。在过去超过30年的发展历程中&#xff0c;LEAD以其在全世界主要国家中占有的市场领导地位…

JUC常见类

背景 JUC是java.util.concurrent的简称&#xff0c;这个包里面存放的都是和多线程相关的类&#xff0c;在面试中非常的重要 目录 1.Callable接口 2.ReentrantLock 3.信号量Semaphore 4.CountDownLatch 5.集合的线程安全问题 1.Callable接口 1.1.认识Callable接口 &#x…

phpstudy 搭建 upload-labs 文件上传靶场

phpstudy 搭建靶场&#xff1a;下载安装好phpstudy后&#xff0c;下载靶场源码&#xff1a; upload-labs下载地址&#xff1a; https://github.com/c0ny1/upload-labs 下载完压缩文件&#xff0c;解压文件&#xff0c;解压后的文件夹命名为upload--labs 将解压后到文件夹放…

爱普生晶振在物联网LoRa通讯中的应用

LoRa 是LPWAN通信技术中的一种&#xff0c;是美国Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案。这一方案改变了以往关于传输距离与功耗的折衷考虑方式&#xff0c;为用户提供一种简单的能实现远距离、长电池寿命、大容量的系统&#xff0c;进而扩展传感网络…

频分复用系统设计及其MATLAB实现

引言 随着通信技术的飞速发展&#xff0c;通信系统的容量需求不断增长。频分复用&#xff08;Frequency Division Multiplexing, FDM&#xff09;作为一种重要的多路复用技术&#xff0c;被广泛应用于现代通信系统中。本文将介绍频分复用系统的设计原理&#xff0c;并展示如何…

springboot 自动配置源码解读

什么是自动装配 当我们程序依赖第三方功能组件时&#xff0c;不需要手动将这些组件类加载到IOC容器中。例如 当程序需要用到redis时&#xff0c;在pom.xml文件中引入依赖&#xff0c;然后使用依赖注入的方式直接从IOC容器中拿到相应RedisTemplate实例。 SpringBootApplication …