30 OpenCV 点多边形测试

文章目录

  • 点多边形测试
  • pointPolygonTest
  • 示例

点多边形测试

在这里插入图片描述

pointPolygonTest

pointPolygonTest(
InputArray  contour,// 输入的轮廓
Point2f  pt, // 测试点
bool  measureDist // 是否返回距离值,如果是false,1表示在内面,0表示在边界上,-1表示在外部,true返回实际距离
)

返回数据是double类型

示例

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
    // 创建一个空白的图像
    const int r = 100;
    Mat src = Mat::zeros(r * 4, r * 4, CV_8UC1);

    // 定义六边形的顶点
    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, 8, 0);
    }

    // 查找轮廓
    vector<vector<Point>> contours;
    vector<Vec4i> hierachy;
    Mat csrc;
    src.copyTo(csrc);
    findContours(csrc, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));

    // 计算每个像素点到轮廓的距离
    Mat raw_dist = Mat::zeros(csrc.size(), CV_32FC1);
    for (int row = 0; row < raw_dist.rows; row++) {
        for (int col = 0; col < raw_dist.cols; col++) {
            // 计算当前像素到轮廓的距离
            double dist = pointPolygonTest(contours[0], Point2f(static_cast<float>(col), static_cast<float>(row)), true);
            // 将距离值转换为float类型并存储到raw_dist图像中
            raw_dist.at<float>(row, col) = static_cast<float>(dist);
        }
    }

    // 将距离映射到颜色,并创建一个新的图像
    double minValue, maxValue;
    minMaxLoc(raw_dist, &minValue, &maxValue, 0, 0, Mat());
    Mat drawImg = Mat::zeros(src.size(), CV_8UC3);
    for (int row = 0; row < drawImg.rows; row++) {
        for (int col = 0; col < drawImg.cols; col++) {
            float dist = raw_dist.at<float>(row, col);
            if (dist > 0) {
                // 正距离映射到蓝色通道
                drawImg.at<Vec3b>(row, col)[0] = (uchar)(abs(1.0 - (dist / maxValue)) * 255);
            }
            else if (dist < 0) {
                // 负距离映射到红色通道
                drawImg.at<Vec3b>(row, col)[2] = (uchar)(abs(1.0 - (dist / minValue)) * 255);
            } else {
                // 距离为0的像素点设为白色
                drawImg.at<Vec3b>(row, col)[0] = (uchar)(abs(255 - dist));
                drawImg.at<Vec3b>(row, col)[1] = (uchar)(abs(255 - dist));
                drawImg.at<Vec3b>(row, col)[2] = (uchar)(abs(255 - dist));
            }
        }
    }

    // 创建窗口并显示图像
    const char* output_win = "point polygon test demo";
    char input_win[] = "input image";
    namedWindow(input_win, CV_WINDOW_AUTOSIZE);
    namedWindow(output_win, CV_WINDOW_AUTOSIZE);

    imshow(input_win, src);
    imshow(output_win, drawImg);

    waitKey(0);
    return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“一个有趣的C语言代码”分析

“一个有趣的C语言代码” 一个有趣的C语言代码-流浪的海豚-ChinaUnix博客 #include <stdio.h> int print() {printf("hello world!\n");return 0; } int main(void) {long base[0];long* result base3;*(result1) *result;*result (long)print;return 0; …

如何安装最新版Docker Compose?

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可以使用 YAML 文件来配置应用服务&#xff0c;然后只需一个简单的命令便能创建和启动所有服务。在本篇博客中&#xff0c;我们将详细介绍如何在 Linux 系统上安装 Docker Compos…

Hive中几个非常重要的问题

1、Hive 有哪些方式保存元数据&#xff0c;各有哪些优缺点 (1).DerBy数据库&#xff1a;默认自带 优点&#xff1a;使用简单&#xff0c;不需要额外的配置。 缺点&#xff1a;只有一个客户端&#xff0c;多个客户访问会报错。 (2).使用MySql数据库存储 优点&#xff1a;单独的…

电商技术揭秘三十二:智能风控体系构建

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

PyQt介绍——动画使用详解之QPropertyAnimation

一、继承关系 PyQt5的动画框架是QAbstractAnimation&#xff0c;它是一个抽象类&#xff0c;不能直接使用&#xff0c;需要使用它的子类。它的类结构如下&#xff1a; QAbstractAnimation&#xff1a;抽象动画&#xff0c;是所有动画的基类&#xff0c;不能直接使用。 QVariant…

SpringCloud之负载均衡Ribbon

Ribbon 是一个客户端负载均衡工具&#xff0c;主要功能是将面向服务的Rest模板&#xff08;RestTemplate&#xff09;请求转换成客户端负载均衡的服务调用。通过Ribbon&#xff0c;开发人员可以在客户端实现请求的负载均衡&#xff0c;而无需单独部署负载均衡器。Ribbon支持多…

C#基础之值类型和引用类型

值类型和引用类型 文章目录 值类型和引用类型1、使用和存储上的区别2、特殊的引用类型string 引用类型&#xff1a;string&#xff0c;数组&#xff0c;类 值类型&#xff1a;其他类型&#xff0c;结构体 1、使用和存储上的区别 1、使用上的区别//值类型int a 10;//引用类型…

Python函数小知识

目录 一、函数的定义和调用 二、函数参数 三、函数作用域 四、递归函数和匿名函数 一、函数的定义和调用 def 函数名(参数): 自定义函数可以分为有参函数和无参函数 。 函数的作用&#xff1a; 在Python中定义函数可以提高代码的复用率&#xff0c;避免重复的代码&#xff0c;…

Android 记录一个SeekBar的滑块显示问题

这两天&#xff0c;要实现一个自定义的进度条SeekBar&#xff0c;从UI那里拿到切图之后&#xff0c;就开始做了&#xff0c;但是最后发现一个问题&#xff0c;看一下图吧&#xff1a; 应该看的很清楚吧&#xff0c;那个滑块周围多了一些“阴影” 我刚开始以为是切图又问题&…

opencv基础篇 ——(七)边缘检测和图像锐化

锐化和边缘检测是图像处理中常用的两种技术&#xff0c;它们可以用来增强图像的特征以及检测图像中的边缘 锐化&#xff1a; 锐化是一种增强图像中细节和边缘的技术&#xff0c;它使图像中的过渡区域更加明显&#xff0c;从而提高图像的清晰度和对比度。常见的锐化方法包括拉普…

matlab保存示波器数据

再重新运行一下示波器 然后就可以在工作区看见&#xff08;这里没有运行所以没有&#xff09; 将保存到文件夹中方便后续绘图

第十五届蓝桥杯省赛第二场C/C++B组D题【前缀总分】题解(AC)

暴力解法 O ( 26 n 5 ) O(26n^5) O(26n5) 枚举将第 i i i 个字符串的第 j j j 个字符改为 c c c 的所有方案&#xff0c;时间复杂度 O ( 26 n 2 ) O(26n^2) O(26n2)&#xff0c;修改并计算总分&#xff0c; O ( n 3 ) O(n^3) O(n3)。 暴力优化 O ( 26 n 3 log ⁡ n ) O…

解析企业绩效通系统架构:构建高效管理与激励平台

在当今竞争激烈的商业环境中&#xff0c;企业需要不断提升管理效率和员工激励力度&#xff0c;以保持竞争优势并实现可持续发展。绩效通系统作为一种集成了绩效管理、激励机制和员工发展规划的管理工具&#xff0c;正逐渐成为现代企业管理的核心组成部分。本文将深入探讨企业绩…

mybatis-plus(二)集成与demo

一、集成 1、pom&#xff1a; 2、配置文件 3、启动类与业务逻辑&#xff1a; 无变化。引入mybatis-plus后&#xff0c;原mybatis逻辑可以正常使用。 二、demo 1、代码框架 &#xff08;1&#xff09;pom&#xff1a; <?xml version"1.0" encoding"UT…

Python实现本地视频/音频播放器

Python实现本地视频/音频播放器 在Python中&#xff0c;有几个库可以用于视频播放&#xff0c;但是没有一个库是完美的&#xff0c;因为它们可能依赖于外部软件或有一些限制。 先看介绍用Python实现本地视频播放器&#xff0c;再介绍用Python实现本地音乐播放器。 Python实现…

CSS Position定位(详解网页中的定位属性)

目录 一、Position介绍 1.概念 2.特点 3.作用 4.应用 二、Position用法 1.position属性 2.static定位 3.fixed定位 4.relative定位 5.absolute定位 6.sticky定位 7.重叠的元素 三、CSS定位属性 四、总结 一、Position介绍 1.概念 文档流&#xff08;Document Fl…

【从后端日志文件中过滤出sql语句】

从后端日志文件中过滤出sql语句 why?思路日志文件的格式 结果 why? 为什么会有这种需求&#xff1f;&#xff0c;mysql数据不小心被删了完全可以从备份数据恢复&#xff0c;或者从binlog中恢复&#xff0c;但是如果前面这两种方法没办法处理&#xff08;没有备份数据库文件、…

ray.tune调参学习笔记1:超参数优化器tuner设置

最近研究中学习使用python的ray.tune进行神经网络调参。在这里记录学习过程中的收获&#xff0c;希望能够帮助到有同样需求的人。学习过程主要参考ray官网文档&#xff0c;但由于笔者使用的ray为2.2.0版本&#xff0c;而官方文档为更高级版本&#xff0c;笔者代码和官方文档代码…

数字藏品:重塑艺术与科技的新媒介

数字藏品&#xff0c;这个新兴的词汇&#xff0c;正在逐渐渗透到我们的日常生活中。它不仅是一种新的艺术表达方式&#xff0c;更是一种科技与艺术相结合的全新媒介。那么&#xff0c;数字藏品究竟是什么呢&#xff1f; 首先&#xff0c;我们需要明确一点&#xff0c;数字藏品并…

qt QTreeWidget 学习

树形控件的节点可以有多层、多个子节点&#xff0c; 如果将子节点全部展开&#xff0c;那么每一行都是一个数据条目。QTreeWidgetItem 比较特殊&#xff0c;一个条目内部可以有多列数据信息&#xff0c;相当于表格控件一整行的表格单元集成为一个条目。 默认情况下&#xff0c;…
最新文章