OpenCV学习三十三:pointPolygonTest 检测点是否在轮廓内

2023-11-05

opencv函数

pointPolygonTest:

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

用于测试一个点是否在多边形中
当measureDist设置为true时,返回实际距离值。若返回值为正,表示点在多边形内部,返回值为负,表示在多边形外部,返回值为0,表示在多边形上。
当measureDist设置为false时,返回 -1、0、1三个固定值。若返回值为+1,表示点在多边形内部,返回值为-1,表示在多边形外部,返回值为0,表示在多边形上。

#include <opencv2/opencv.hpp>
#include "iostream"

using namespace std;
using namespace cv;

int main( int argc, char** argv )
{
	Mat img = imread("fengye.jpg");
	threshold(img, img, 127, 255, CV_THRESH_BINARY);
	cvtColor(img ,img ,CV_BGR2GRAY);
	
	vector<vector<Point>> contours;
	vector<Vec4i> hierachy;
	findContours(img, contours, hierachy, RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
	drawContours(img, contours, 1, Scalar::all(255), 2, 8, hierachy);

	//这里说明下,轮廓1是圈出的枫叶
	Mat dist = Mat::zeros(img.size(), CV_32FC1);
	for (int i=0; i<img.rows; i++)	{
		for (int j=0; j<img.cols; j++)	{
			double distance = pointPolygonTest(contours[1], Point2f(j, i), true);
			dist.at<float>(i, j) = static_cast<float>(distance);
		}
	}



	double minVal, maxVal;
	minMaxLoc(dist, &minVal, &maxVal, 0, 0, Mat());
	Mat drawImg1 = Mat::zeros(img.size(), CV_8UC3);
	int thredVal1 = 1;
	for (int i=0; i<img.rows; i++)	{
		for (int j=0; j<img.cols; j++)	{
			double distance = dist.at<float>(i,j);
			if (distance > thredVal1){
				drawImg1.at<Vec3b>(i,j)[0] = (uchar)(abs(distance/maxVal)*255);
			} else if (distance < (thredVal1 *(-1)) ){
				drawImg1.at<Vec3b>(i,j)[2] = (uchar)(abs(distance/minVal)*255);
			} else {
				drawImg1.at<Vec3b>(i,j)[0] = (uchar)(abs(255-distance));
				drawImg1.at<Vec3b>(i,j)[1] = (uchar)(abs(255-distance));
				drawImg1.at<Vec3b>(i,j)[2] = (uchar)(abs(255-distance));
			}
		}
	}
	imshow("drawImg1", drawImg1);
	imwrite("drawImg1.jpg", drawImg1);



	normalize(dist, dist, -255, 255, NORM_MINMAX);
	Mat drawImg2 = Mat::zeros(img.size(), CV_8UC3);
	int thredVal2 = 3;
	for (int i=0; i<img.rows; i++)	{
		for (int j=0; j<img.cols; j++)	{
			double distance = dist.at<float>(i,j);
			if (distance > thredVal2){
				drawImg2.at<Vec3b>(i,j)[0] = (uchar)(distance);
			} else if (distance < (thredVal2 *(-1)) ){
				drawImg2.at<Vec3b>(i,j)[2] = (uchar)(distance*(-1));
			} else {
				drawImg2.at<Vec3b>(i,j)[0] = (uchar)(255);
				drawImg2.at<Vec3b>(i,j)[1] = (uchar)(255);
				drawImg2.at<Vec3b>(i,j)[2] = (uchar)(255);
			}
		}
	}
	imshow("drawImg2", drawImg2);
	imwrite("drawImg2.jpg", drawImg2);
	
	imshow("img", img);
		
	waitKey();
	return 0;
}

原图

 

drawImg1

 

drawImg2

说明下:白色线的位置差异是由于归一化的方式不同,在第一种方式中肯定可以锁定到轮廓上,在第二种方式中由于最大最小距离的绝对值不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV学习三十三:pointPolygonTest 检测点是否在轮廓内 的相关文章

  • 使用 Azure 机器学习检测图像中的符号

    4年前我发帖这个问题 https stackoverflow com q 6999920 411094不幸的是 得到的一些答案超出了我的技能水平 我刚刚参加了一次构建巡演会议 他们在会上谈论了机器学习 这让我想到了使用 ML 来解决我的问题
  • 检测骰子的上侧

    是否可以检测骰子的上面 虽然从顶部看这将是一项简单的任务 但从许多角度来看 可以看到多个侧面 Here is an example of a dice feel free to take your own pictures 您通常想知道自己
  • OpenCV:使用 StereoCamera 系统对颜色标记进行 3D 姿态估计

    我有一个立体摄像系统并使用两者正确校准它 cv calibrateCamera and cv stereoCalibrate My reprojection error似乎没问题 凸轮0 0 401427 凸轮1 0 388200 立体声
  • 如何将 opencv mat 图像转换为 gdi 位图

    我想将 openCV Mat 文件转换为 GDI 位图图像 我找不到任何有关如何执行此操作的信息 我认为没有直接的方法可以做到这一点 但我希望它不涉及将其写入文件并读回 http opencv users 1802565 n2 nabble
  • 如何使用Java OpenCV

    我正在使用图像处理开始我的最后一年项目 并希望完成类似的事情this http www youtube com watch v EPai5f2sWaA 它是人体和物体检测的结合 我真的很想用 Java 来做 因为我在 C 方面的经验很少 I
  • 如何将图像从 np.uint16 转换为 np.uint8?

    我正在创建一个图像 image np empty shape height width 1 dtype np uint16 之后我将图像转换为 BGR 模型 image cv2 cvtColor image cv2 COLOR GRAY2B
  • 使用 SURF 在检测到的对象周围绘制矩形

    我正在尝试从涉及冲浪检测器的以下代码中检测对象 我不想绘制匹配项 我想在检测到的对象周围绘制一个矩形 但不知何故我无法获得正确的单应性 请任何人指出在哪里我走错了 include
  • opencv如何使用鼠标事件不规则地选择图像区域? c/c++ [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 最近在学习opencv 有没有办法使用鼠标事件选择图像区域 我已经尝试过三角形的了 如果我想选择特定区域而不是三角形怎么办 谢谢你 我对此进
  • OpenCV 读取视频文件时内存不足

    此示例从文件中读取视频cv2 VideoCapture在 python OpenCV 中内存不足 import cv2 cap cv2 VideoCapture file mp4 while True ret frame cap read
  • 如何确定透视变换后的点在新图像平面中的位置?

    我使用 OpenCV Python Numpy 图像中有三个点 我知道这些点的确切位置 P1 P2 N1 我要将图像转换为另一个视图 例如 我将透视图转换为侧视图 如果这样做 我将无法获得图像平面中这三个点的确切位置 我应该以一种可以获得这
  • GrabCut - bgdModel 和 fgdModel 为空 - 断言错误

    我正在尝试使用 OpenCV2 1 C 中的 GrabCut 算法进行图像分割 这是我的代码 Mat rgbWorkImage imread argv 1 Mat mask mask Scalar 0 Mat bgdModel fgdMod
  • Android API人脸检测与OpenCV/JavaCV人脸检测

    我在 Android 设备上使用了本地 Android 人脸检测 但它似乎很慢 而且我不太确定其可靠性 我还使用了 OpenCV 的人脸检测 但仅限于 PC 而不是 Android 设备 对于 Android 我猜我必须使用 JavaCV
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 如何绘制每个分割对象的轮廓

    我应用分水岭分割来检测触摸对象 这样做效果很好 现在 我想绘制每个对象的轮廓 这样我就可以获得它们的长度 面积 矩等 但是分割结果中的对象仍然是触摸的 所以 我没能画出每一个的轮廓 如何绘制每个对象的轮廓 include
  • Opencv C++ 检测并裁剪图像上的白色区域

    我在网上搜索过 已经找到了一些方法来完成我想要的事情 但是与我需要的相比 这些方法的效率较低 我有一个 kinect 使用 Microsoft SDK 当前正在获取一个移除背景的人 将结果保存在 3 通道 Mat 中 并将该人从背景中移除
  • Python 2.7从非默认目录打开多个文件(对于opencv)

    我在 64 位 win7 上使用 python 2 7 并拥有 opencv 2 4 x 当我写 cv2 imread pic 时 它会在我的默认 python 路径中打开 pic 即C Users Myname 但是我如何设法浏览不同的目
  • 线程“main”java.lang.UnsatisfiedLinkError中出现异常:java.library.path中没有opencv_java249

    我目前正在尝试在我的 32 位笔记本电脑上设置 OpenCV 但我不断收到一条令我困惑的错误消息 Exception in thread main java lang UnsatisfiedLinkError no opencv java2
  • OpenCV OpenNI 校准kinect

    我使用 home 通过 kinect 进行捕捉 capture retrieve depthMap CV CAP OPENNI DEPTH MAP capture retrieve bgrImage CV CAP OPENNI BGR IM
  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C

随机推荐

  • Windows主机信息搜集

    注意 一切内容仅用于信息技术分享 切勿用于其他用途 一切后果与作者无关 前言 通过命令执行使用cs拿到了内网的一台主机 接下来我们进行内网的信息搜集 1 内网环境分析 内网渗透 在拿到webshell的时候 想办法获取系统信息拿到系统权限
  • 四个/24地址块,试进行最大可能的聚合

    由于四个地址块前两个字节都相同 只需将每个地址块的第三个字节转换为二进制 212 56 132 0 24 212 56 10000100 0 212 56 133 0 24 212 56 10000101 0 212 56 134 0 24
  • C#控件命名规范

    类 型 前 缀 示 例 Adrotator adrt adrtTopAd BulletedList blst blstCity Button btn btnSubmit Calendar cal calMettingDates CheckB
  • nginx: [emerg] could not build the server_names_hash

    手头有块板子 上面起了nginx配置了多个域名 启动的时候发现报错 nginx emerg could not build the server names hash you should increase server names has
  • pandas中的时间序列

    一 夯实基础 datetime 模块中的数据类型 date 以公历形式存储日历日期 年月日 time 将时间存储为时分秒毫秒 datetime 存储日期和时间 timedelta 表示两个datetime值之间的差 日 秒 毫秒 1 获取当
  • 无效数据处理攻略: 如何从源头开始预防无效数据带来的风险

    数据处理在现代社会中变得越来越重要 而对于数据的可靠性和准确性 我们始终非常关注 然而 即使在对数据进行了精心管理的情况下 无效数据依然可能存在 并可能对数据分析和决策带来不良影响 因此 处理无效数据变得愈发重要 一 什么是无效数据 在处理
  • app数据分析体系 - 用户粘性 DAU,MAU 和 月人均活跃天数

    用户粘性指标 DAU MAU 月均活跃天数 DAU 和 MAU 日活跃用户占月活跃用户的比例越高 表明用户对App的使用粘性越高 DAU 即 Daily Active User 指日活跃用户数 MAU 即 Monthly Active Us
  • 后端进阶之路——深入理解Spring Security配置(二)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 后端进阶之路 文章
  • A/B测试是什么?面试官把我问懵了!

    什么是A B测试 A B测试是为 web 或 app 界面或流程制作两个 A B 或多个版本 在同一时间维度 分别让组成成分相同 相似 的访客群组 目标人群 随机的访问这些版本 收集各群组的用户体验数据和业务数据 最后分析 评估出最好版本
  • Golang 枚举详解

    什么是枚举 枚举 Enumeration 是一种常见的编程概念 它定义了一组命名常量 我们知道在 Go 语言中定义常量是这样的形式 const A a B b 开发者可以使用枚举创建复杂的 有限的常量集 这些常量集具有有意义的名称和唯一的值
  • 将 Bean 注入 Spring 容器的方法

    这里写目录标题 1 Configuration Bean 2 Componet ComponentScan 3 Import 注解导入 3 1 Import 直接导入类 3 2 Import ImportSelector接口 3 3 Imp
  • Microsoft Visual Studio 2013产品激活密钥

    win7 win8 win10系统下Visual Studio 2013各个版本的密钥 Visual Studio Ultimate 2013 KEY BWG7X J98B3 W34RT 33B3R JVYW9 Visual Studio
  • unity3D 物体跟随移动

    脚本挂载移动的物体上 public class Player MonoBehaviour public float Speed 4 Use this for initialization void Start Update is calle
  • c++打怪小游戏——修仙之路1.5

    这次我们要出示的程序是修仙之路1 5版本的 这个程序在c 打怪小游戏 修仙之路1 0多加了好几个功能 这次我们在这个程序中多加了一些代码 我们为下面的优化多准备一个头文件 include
  • MAVEN在IDEA中的应用

    idea集成maven插件 settings gt 输入maven gt 选择本地maven安装路径 配置文件以及本地仓库的路径 创建非web的maven工程 创建工程 gt 选择maven 下一步之后填写项目的坐标 类似于全类名 下一步之
  • Zotero win10/mac/iPad三台设备同步

    刚入坑Zotero 发现同步功能很强大 刚好手上有三台设备 就试着捣鼓了下 最终结果不错 记录一下 参考来源 https sspai com post 64283 少数派 用 Zotero 坚果云搞定多设备文献管理 https blog c
  • 虚拟机中linux_server搭建

    linux server environment 1 Installation in vmware workstation 1 1 steps 略 普通的虚拟机系统安装模式 2 linux 中存储设备的使用 linux 中所有存储设备都是通
  • 华为云服务器无法ssh连接&&可以公网ip访问

    基本是SSH服务没有打开的原因 在华为的配置里面默认打开了22号端口 但是需要修改ssh配置文件 首先从华为云服务管理界面远程登录进去 然后会看到 然后登陆之后修改ssh的配置文件 sudo vi etc ssh sshd config 将
  • Scrapy 爬虫完整案例—从小白到大神(银行网点信息为例)

    采用selenium界面抓取信息 需要渲染界面 并且也是单线程操作 效率极低 一晚上只爬去了一个工行的数据 突然想到了分布式爬虫 安装 Scrapy pip版本过于老旧不能使用 需要升级pip版本 输入python m pip instal
  • OpenCV学习三十三:pointPolygonTest 检测点是否在轮廓内

    opencv函数 pointPolygonTest C double pointPolygonTest InputArray contour Point2f pt bool measureDist 用于测试一个点是否在多边形中 当measu