opencv::点多边形测试
点多边形测试
测试一个点是否在给定的多边形内部,边缘或者外部
double pointPolygonTest(
InputArray contour, // 输入的轮廓
Point2f pt, // 测试点
bool measureDist // 是否返回距离值,如果是false,1表示在内面,0表示在边界上,-1表示在外部,true返回实际距离
)
步骤
构建一张400x400大小的图片, Mat::Zero(, , CV_8UC1)
画上一个六边形的闭合区域line
发现轮廓
对图像中所有像素点做点 多边形测试,得到距离,归一化后显示。
int main(int argc, char** argv) {
const int r = ;
Mat src = Mat::zeros(r * , r * , CV_8UC1);
vector<Point2f> vert();
vert[] = Point( * r / , static_cast<int>(1.34*r));
vert[] = Point( * r, * r);
vert[] = Point( * r / , static_cast<int>(2.866*r));
vert[] = Point( * r / , static_cast<int>(2.866*r));
vert[] = Point( * r, * r);
vert[] = Point( * r / , static_cast<int>(1.34*r));
for (int i = ; i < ; i++) {
line(src, vert[i], vert[(i + ) % ], Scalar(), , , );
}
// 画一个六边型
imshow("input_win", src);
vector<vector<Point>> contours;
vector<Vec4i> hierachy;
Mat csrc;
src.copyTo(csrc);
//边界发现
findContours(csrc, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(, ));
Mat raw_dist = Mat::zeros(csrc.size(), CV_32FC1);
for (int row = ; row < raw_dist.rows; row++) {
for (int col = ; col < raw_dist.cols; col++) {
double dist = pointPolygonTest(contours[], Point2f(static_cast<float>(col), static_cast<float>(row)), true);
raw_dist.at<float>(row, col) = static_cast<float>(dist);
}
}
double minValue, maxValue;
minMaxLoc(raw_dist, &minValue, &maxValue, , , Mat());
Mat drawImg = Mat::zeros(src.size(), CV_8UC3);
for (int row = ; row < drawImg.rows; row++) {
for (int col = ; col < drawImg.cols; col++) {
float dist = raw_dist.at<float>(row, col);
if (dist > ) {
//内部
drawImg.at<Vec3b>(row, col)[] = (uchar)(abs(1.0 - (dist / maxValue)) * );
}
else if (dist < ) {
//外部
drawImg.at<Vec3b>(row, col)[] = (uchar)(abs(1.0 - (dist / minValue)) * );
}
else {
//边缘
drawImg.at<Vec3b>(row, col)[] = (uchar)(abs( - dist));
drawImg.at<Vec3b>(row, col)[] = (uchar)(abs( - dist));
drawImg.at<Vec3b>(row, col)[] = (uchar)(abs( - dist));
}
}
}
imshow("output_win", drawImg);
waitKey();
return ;
}
opencv::点多边形测试的更多相关文章
- windows10(x64)+Qt+opencv配置及测试
本电脑系统:Windows10 64位 要下载的文件: 1.Qt 5.6.0 for Windows 32-bit,下载地址:(可以复制链接地址,用迅雷下载,速度快) http://download. ...
- ubuntu 14.04 安装opencv 3.0 测试
安装opencv 前面步骤参考 http://my.oschina.net/u/1757926/blog/293976 主要修改测试代码 1. 先从sourceforge上下载OpenCV的源码 2. ...
- 【Java 其他】Java opencv配置及测试
毕竟研究生做cv,所以这里还是测试一下java上使用opencv,参考 这里 import org.opencv.core.Core; import org.opencv.core.CvType; i ...
- OpenCV 传统分割测试
github官网源文件:https://github.com/opencv/opencv/tree/master/samples/python 最好是先克隆整个仓库下来,再测试里面的:floodfil ...
- vs2012配置opencv及简单测试
为visual studio2012搭建openCV平台,实现打开图片. 实现步骤: 1.1.配置环境变量 基于win7操作系统的环境配置步骤: 1.1.1 计算机—>属性—>更改设置—& ...
- OpenCV安装和测试
参考链接:http://blog.csdn.net/bruce_zeng/article/details/7961153 OpenCv下载链接:http://sourceforge.net/proje ...
- [opencv]approxDP多边形逼近获取四边形轮廓信息
#include "opencv2/opencv.hpp" #include <iostream> #include <math.h> #include & ...
- OpenCV——使用多边形包围轮廓
- [opencv]计算多边形逼近曲线的长度
//利用曲线逼近,计算逼近曲线的长度 //首先创建一个逼近曲线 vector<Point2f> approx; approxPolyDP(contours[i], approx, 2, t ...
随机推荐
- 使用如下命令修改.bashrc文件
使用如下命令修改.bashrc文件: gedit ~/.bashrc 编辑之后必须执行 source ~/.bashrc
- Tomcat9 安装与配置
一.下载 到http://tomcat.apache.org/下载绿色解压包 二.启动 1.解压后打开tomcat/bin目录下的startup.bat即可启动 打开后发现出现乱码 解决方法: 打开t ...
- JRebel 破解最简单的使用
### 前提提示 JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效.IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,才能生效, ...
- OAuth2.0 RFC 6749 中文
英文原版:https://tools.ietf.org/html/rfc6749 转自:https://github.com/jeansfish/RFC6749.zh-cn 一.简介 在传统的客户端- ...
- C++基础之顺序容器
顺序容器简介: 顺序容器类型 描述 vector 可变大小数组,支持快速访问,在尾部之外的地方插入或删除时可能很慢 deque 双端队列.支持快速访问,在头尾插入删除会很快. list 双向列表.只支 ...
- F#周报2019年第39期
新闻 宣告F# 4.7 宣告.NET Core 3.0 .NET Core 3.0中ASP.NET Core与Blazor的更新 .NET Conf 2019里提到的ML.NET与模型构建器 参与.N ...
- Proxy实现java动态代理
在java设计模式中代理模式的应用比较广泛, 比如我在编写一写web程序时在filter修改request或response时, 而request中并没有相应的set方法, 这样要做到修改就需要使用一 ...
- CPU的物理数、核心数、线程数
最近了解下CPU的参数,主要是对常见的CPU参数指标:物理数.核心数以及线程数做了下了解.增长了点自己的见识,方便自己回忆和分享,记录下来.参考了网上的一些说明并加以整理,形成该随笔.主要参考链接如下 ...
- [Redis] Redis的基本数据结构
key-value 通过key获取或设置value SET key value GET key SET server:name "fido" GET server:name SET ...
- TF-IDF算法——原理及实现
TF-IDF算法是一种用于信息检索与数据挖掘的常用加权技术.TF的意思是词频(Term - frequency),IDF的意思是逆向文件频率(inverse Document frequency). ...