概念介绍 - 点多边形测试

  • 测试一个点是否在给定的多边形内部,边缘或者外部

API介绍 cv::pointPolygonTest

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

演示代码-步骤

  1. 构建一张400x400大小的图片, Mat::Zero(400, 400, CV_8UC1)
  2. 画上一个六边形的闭合区域line
  3. 发现轮廓
  4. 对图像中所有像素点做点 多边形测试,得到距离,归一化后显示。

程序代码:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;int main( int argc, char** argv ){// 绘制一张6边形的图像    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));// 在src内部绘制,并显示出来for (int i = 0; i < 6; i++) {line(src, vert[i], vert[(i + 1) % 6], Scalar(255), 3, 8, 0);}char* source_window = "Source";namedWindow( source_window, CV_WINDOW_AUTOSIZE );imshow( source_window, src );// 得到轮廓vector<vector<Point> > contours; vector<Vec4i> hierarchy;//也可以写成:src.copyTo(src_copy);Mat src_copy = src.clone();// findContours 会改动输入图像 src 中元素的值,所以这里需要完全复制一份src//发现轮廓findContours( src_copy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);// 计算到轮廓的距离,也可以写成:Mat raw_dist = Mat::zeros(src_copy.size(), CV_32FC1);Mat raw_dist( src.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);//点多边形测试raw_dist.at<float>(row, col) = static_cast<float>(dist);//raw_dist.at<float>(row,col) = pointPolygonTest( contours[0], Point2f(i,j), true ); }}//绘制原图轮廓Mat dst = Mat::zeros(src.size(), CV_8UC3);for (size_t i = 0; i < contours.size(); i++) {drawContours(dst, contours, i, Scalar(0, i == 0 ? 0 : 255, 255), 2, 8, hierarchy, 0, Point(0, 0));}imshow("foundContours33", dst);// 绘制距离色差图,类似于 距离变换double minVal, maxVal;minMaxLoc( raw_dist, &minVal, &maxVal, 0, 0, Mat() );//获取最大最小距离,方便颜色归一化到255之间minVal = abs(minVal); maxVal = abs(maxVal);// 图形化的显示距离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 / maxVal)) * 255);//蓝}else if (dist < 0) { // 轮廓外部,越远离轮廓越黑drawImg.at<Vec3b>(row, col)[2] = (uchar)(abs(1.0 - (dist / minVal)) * 255);//红}else { // 轮廓边线上,白色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));}}}// 创建窗口显示结果namedWindow( "Distance", CV_WINDOW_AUTOSIZE );imshow( "Distance", drawImg );/*  //与上面“图形化的显示距离”代码的功能相同,只是不同的显示方法而已,可以忽略// 图形化的显示距离Mat drawing = Mat::zeros( src.size(), CV_8UC3 );//用彩色图反差距离for( int j = 0; j < src.rows; j++ ){ for( int i = 0; i < src.cols; i++ ){if( raw_dist.at<float>(j,i) < 0 ){ drawing.at<Vec3b>(j,i)[0] = 255 - (int) abs(raw_dist.at<float>(j,i))*255/minVal; }else if( raw_dist.at<float>(j,i) > 0 ){ drawing.at<Vec3b>(j,i)[2] = 255 - (int) raw_dist.at<float>(j,i)*255/maxVal; }else{ drawing.at<Vec3b>(j,i)[0] = 255; drawing.at<Vec3b>(j,i)[1] = 255; drawing.at<Vec3b>(j,i)[2] = 255; }}}// 创建窗口显示结果namedWindow( "drawing", CV_WINDOW_AUTOSIZE );imshow( "drawing", drawing );*/waitKey(0);return(0);
}

运行截图:


参考博客

  1. https://blog.csdn.net/huanghuangjin/article/details/81191011
  2. https://blog.csdn.net/LYKymy/article/details/83210442

OpenCV-图像处理(32、点多边形测试)相关推荐

  1. Java OpenCV 图像处理32.4 视频分析和对象跟踪 切换背景

    Java OpenCV 图像处理32.4 视频分析和对象跟踪 切换背景 方法 含义 解释 bitwise_and "与"操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制 ...

  2. OpenCV计算机图像处理 —— 凸性缺陷 + 点多边形测试 + 形状匹配 + 轮廓分层与cv.findContours()

    OpenCV计算机图像处理 -- 凸性缺陷 + 点多边形测试 + 形状匹配 + 轮廓分层与cv.findContours() 目录 OpenCV计算机图像处理 -- 凸性缺陷 + 点多边形测试 + 形 ...

  3. OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试

    在图像中寻找轮廓 目标 在这个教程中你将学到如何: 使用OpenCV函数 findContours 使用OpenCV函数 drawContours 原理 例程 教程的代码在下面给出. 你也可以从 这里 ...

  4. OpenCV图像处理基础(C++版)

    目录 OpenCV环境搭建 加载 修改 保存图像 矩阵的掩膜操作 Mat对象 图像操作 图像混合 调整图像亮度与对比度 绘制形状与文字 模糊图像一 模糊图像二 膨胀与腐蚀 形态学操作 形态学操作应用- ...

  5. OpenCV 图像处理编程学习笔记

    <OpenCV编程实例代码>各章重点知识点简述 第一章 OpenCv环境配置 第二章 图像及视频的基本操作 第二部分 图像处理技术 第三章 图像灰度变换技术 第四章 图像平滑技术 第五章 ...

  6. halcon opencv 图像处理面试指南

    珠海某上市公司算法总监: 1.相机标定的原理与坐标系之间的转换,如何转换 2.激光三角原理,如何搭建 3.测量拟合的过程中有哪些算子,原理什么,接着问5,跌代多少次?什么情况最优,如何优化, 4.那个 ...

  7. opencv图像处理总结

    opencv图像处理基本操作 1. 矩阵数据类型 通用矩阵数据类型: CV_<bit_depth>(S|U|F)C<number_of_channels> 其中,S表示带符号整 ...

  8. OpenCV图像处理(13)——指定区域截取和指定区域复制

    前言: 在令人讨厌的的自动屏保中突然看到一张漂亮的图片(懂就行!),就想赶紧按了键盘上的截屏键,当发现无法去掉上面的文字. 于是乎,图像处理的我就和邱邱一起研究如何将其去掉. 思路: 该图片上的文字和 ...

  9. OPENCV图像处理基础

    OPENCV图像处理基础 1.图像处理基础 1.1 数字图像 1.1.1 数字图像概念: 1.1.2 数字图像起源: 1.1.3 常见成像方式: 1.1.4 数字图像的应用: 1.1.5 Opencv ...

  10. 免费送书啦!《 OpenCV图像处理入门与实践》一本全搞定

    OpenCV 的基础图像操作都只是针对图像中的像素点,并不是直接对图像整体进行的操作.而很多时候并不能仅通过改变像素点来进行图像的操作,为此我们需要学习关于图像的算术操作. 1.图像加法 对于两张相同 ...

最新文章

  1. 汇编:CF(carry flag)标志位
  2. 小程序: 在同一个文件夹中配置多个页面
  3. Java入门教程[9天快速入门JAVA]
  4. 2.导数——线性代数回顾、曲线概念_1
  5. IntelliJ Idea学习笔记004--- idea修改格式化代码快捷键_顺带一个激活地址_以及常用快捷键
  6. 谁为“上班玩耍”买单
  7. 计算机运行异常怎么办,电脑开机出现windows错误恢复怎么办
  8. Vue 记录一次安装插件引起的项目崩溃(This is probably not a problem with npm,there is likely additional logging outp)
  9. C语言求23阶行列式,AX=0通解,施密特正交化
  10. Web Scraper入门
  11. 七年时间,微软智能云在中国走过的“大江大河”
  12. java判断值是枚举类型?
  13. R语言地理加权回归数据分析
  14. 高斯数据库基于mysql_高斯数据库 (gaussDB) - 基于 JDBC 开发 (1)
  15. 【STM32学习笔记】(9)——串口通讯(USART)详解
  16. 王朝落日,读《万历十五年》
  17. 别把白内障拖成青光眼,不可逆的致盲眼病最可怕!
  18. Kggle比赛之Artifical Neural Networks Applied to Taxi Destination Prediction
  19. 1056: 幸运数字 C语言
  20. 基于matlab的磁悬浮控制系统,基于MATLAB的磁悬浮控制系统的研究

热门文章

  1. python读取excel(xlrd)
  2. 关于按钮背景透明 + div拖拽
  3. Linux下搭建Haproxy负载均衡
  4. python 100 days github_GitHub - Andyhe2019/Python-100-Days: Python - 100天从新手到大师
  5. python下载完是什么样的图片_[宅男福利]用Python下载页面中所有的图片
  6. Android篮球计分器App
  7. 一个借口几万条数据但是只返回十条_爬虫实践之爬取10000条菜谱数据
  8. python语言数值操作符_Python之组合数据类型、逻辑操作符、控制流语句、算术操作符...
  9. 上海科技大学计算机研究生调剂,2021年上海科技大学考研招生调剂信息
  10. ajajx请求php能设置cookie,为什么在AJAX请求返回后浏览器没有设置cookie?