OpenCV生成点集的Delaunay剖分和Voronoi图
实现内容:
设置一副图像大小为600*600。图像像素值全为0,为黑色。
在图像中Rect(100,100,400,400)的区域随机产生20个点。并画出。
产生这些点集的Delaunay剖分和Voronoi图。并画出。
程序
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//随机产生一个点集
vector<Point2f> generatePointSet(int n,Rect rect)
{
vector<Point2f> pointSet;
for (int i = 0; i < n;i++)
{
Point2f fp((float)(rand() % (rect.width - 2*rect.x) + rect.x),
(float)(rand() % (rect.height - 2*rect.y) + rect.y));
pointSet.push_back(fp);
}
return pointSet;
}
//标记出点
static void drawPoint(Mat& img, Point2f fp, Scalar color)
{
circle(img, fp, 3, color, CV_FILLED, 8, 0);
}
//画出点集
static void drawPointSet(Mat& img, vector<Point2f> pointSet, Scalar color)
{
for (int i = 0; i < pointSet.size();i++)
{
drawPoint(img, pointSet[i], color);
}
}
//画出剖分
static void drawSubdiv(Mat& img, Subdiv2D& subdiv, Scalar delaunay_color)
{
vector<Vec6f> triangleList;
subdiv.getTriangleList(triangleList);
vector<Point> pt(3);
for (size_t i = 0; i < triangleList.size(); i++)
{
Vec6f t = triangleList[i];
pt[0] = Point(cvRound(t[0]), cvRound(t[1]));
pt[1] = Point(cvRound(t[2]), cvRound(t[3]));
pt[2] = Point(cvRound(t[4]), cvRound(t[5]));
line(img, pt[0], pt[1], delaunay_color, 1, CV_AA, 0);
line(img, pt[1], pt[2], delaunay_color, 1, CV_AA, 0);
line(img, pt[2], pt[0], delaunay_color, 1, CV_AA, 0);
}
}
//画出Voronoi图
static void paintVoronoi(Mat& img, Subdiv2D& subdiv)
{
vector<vector<Point2f> > facets;
vector<Point2f> centers;
subdiv.getVoronoiFacetList(vector<int>(), facets, centers);
vector<Point> ifacet;
vector<vector<Point> > ifacets(1);
for (size_t i = 0; i < facets.size(); i++)
{
ifacet.resize(facets[i].size());
for (size_t j = 0; j < facets[i].size(); j++)
ifacet[j] = facets[i][j];
Scalar color;
color[0] = rand() & 255;
color[1] = rand() & 255;
color[2] = rand() & 255;
fillConvexPoly(img, ifacet, color, 8, 0);
ifacets[0] = ifacet;
polylines(img, ifacets, true, Scalar(), 1, CV_AA, 0);
circle(img, centers[i], 3, Scalar(), CV_FILLED, CV_AA, 0);
}
}
int main()
{
//创建点集
Rect rect(100,100,400,400);
Mat img(rect.size(), CV_8UC3);
img = Scalar::all(0);
vector<Point2f> pointset = generatePointSet(20,rect);
Mat img_ptst = img.clone();
drawPointSet(img_ptst,pointset,Scalar(0,255,0));
imshow("Point set",img_ptst);
imwrite("pointSet.jpg",img_ptst);
//创建Delaunay剖分
Subdiv2D subdiv(rect);
for (int i = 0; i < pointset.size();i++)
{
subdiv.insert(pointset[i]);
}
//画出Delaunay剖分三角形
Mat img_delaunay = img.clone();
drawSubdiv(img_delaunay, subdiv, Scalar(255,255,255));
imshow("Delaunay", img_delaunay);
imwrite("delaunay.jpg", img_delaunay);
//画出Voronoi图
Mat img_voronoi = img.clone();
paintVoronoi(img_voronoi, subdiv);
imshow("Voronoi", img_voronoi);
imwrite("voronoi.jpg", img_voronoi);
waitKey(0);
return 0;
}
结果
OpenCV生成点集的Delaunay剖分和Voronoi图的更多相关文章
- Delaunay剖分与平面欧几里得距离最小生成树
这个东西代码我是对着Trinkle的写的,所以就不放代码了.. Delaunay剖分的定义: 一个三角剖分是Delaunay的当且仅当其中的每个三角形的外接圆内部(不包括边界)都没有点. 它的存在性是 ...
- Voronoi图和Delaunay三角剖分
刷题的时候发现了这么一个新的东西:Voronoi图和Delaunay三角剖分 发现这个东西可以$O(nlogn)$解决平面图最小生成树问题感觉非常棒 然后就去学了.. 看的n+e的blog,感谢n+e ...
- C++ 生成 voronoi 图 & C++生成泰森多边形图形
1. 功能 生成voronoi图的一个类 2. 代码 VoronoiDiagramGenerator.h #pragma once //Microsoft Visual Studio 2015 Ent ...
- Voronoi图及matlab实现
[题外话:想一想真是...美赛时我预测求爱尔兰的充电站位置分布,画Voronoi图,程序跑了一个小时...] Voronoi图,又叫泰森多边形或Dirichlet图,它是由一组由连接两邻点直线的垂 ...
- 渲染voronoi图
渲染voronoi图要比计算voronoi图简单. 渲染voronoi图: 方法1: 在pixel shader里,对每一个像素,求哪个种子点到它的距离最近,将此种子点的颜色作为此像素颜色. 当种子点 ...
- Arcgis做出voronoi图
人类第一步,,,我需要给我目前的基站点数据划分voronoi,预期得到每个基站的服务范围 在地统计模块geostatistical analysis 下面的数据探索expore就有Voronoi图 将 ...
- 《图像处理实例》 之 Voronoi 图
Voronoi 图的设计 以下的改进是http://www.imagepy.org/的作者原创,我只是对其理解之后改进和说明,欢迎大家使用这个小软件! 如有朋友需要源工程,请在评论处留邮箱! 说明:类 ...
- python opencv 生成验证码
基本思路是使用opencv来把随机生成的字符,和随机生成的线段,放到一个随机生成的图像中去. 虽然没有加复杂的形态学处理,但是目前看起来效果还不错 尝试生成1000张图片,但是最后只有998张,因为有 ...
- opencv生成灰度图并保存
#include <opencv2/opencv.hpp>#include <iostream> using namespace cv;using namespace std; ...
随机推荐
- vi 使用介绍
参考 <<vi编辑器使用介绍>>文本编辑器有很多,比如图形模式的gedit.kwrite.OpenOffice ,文本模式下的编辑器有vi.vim(vi的增强版本)和nano, ...
- nodejs安装教程
http://www.runoob.com/nodejs/nodejs-install-setup.html nodejs官方下载,之后配置环境path,npm随着nodejs安装,自动安装 查看no ...
- 简单的实现web聊天界面,一对一
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 2017-2018-2 20179204《网络攻防实践》第十一周学习总结 SQL注入攻击与实践
第1节 研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 1.1 原理 在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统 ...
- Jquery : 上下滚动--单行 批量多行 文字图片翻屏【转】
原文发布时间为:2010-02-01 -- 来源于本人的百度文章 [由搬家工具导入] 注:如果和左右滚动一起使用,则会出现冲突 一单行滚动(ad:http://www.gz138.com) <! ...
- SQL Server 2005 无法连接到 127.0.0.1
[问题描述]如果连接本机的数据库服务器,服务器名称可填: 127.0.0.1或localhost或本机机器全名(比如HOME),有时候用本机机器名可以登录SQL Server 2005,但用127.0 ...
- hdu 4990(数学,等比数列求和)
Reading comprehension Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- hdu 3440(差分约束好题)
House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- interview ms1 N_Dorm
判断是否为n回文,比如 a b a 是1 回文, abcdab是2回文. 输入: abcabc|3 这种格式,输出true or false #include <iostream> #in ...
- LeetCode OJ-- Flatten Binary Tree to Linked List **
https://oj.leetcode.com/problems/flatten-binary-tree-to-linked-list/ 二叉树的处理,将二叉树转换成类似一个单链表的东东,并且原地. ...