实现内容:

设置一副图像大小为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图的更多相关文章

  1. Delaunay剖分与平面欧几里得距离最小生成树

    这个东西代码我是对着Trinkle的写的,所以就不放代码了.. Delaunay剖分的定义: 一个三角剖分是Delaunay的当且仅当其中的每个三角形的外接圆内部(不包括边界)都没有点. 它的存在性是 ...

  2. Voronoi图和Delaunay三角剖分

    刷题的时候发现了这么一个新的东西:Voronoi图和Delaunay三角剖分 发现这个东西可以$O(nlogn)$解决平面图最小生成树问题感觉非常棒 然后就去学了.. 看的n+e的blog,感谢n+e ...

  3. C++ 生成 voronoi 图 & C++生成泰森多边形图形

    1. 功能 生成voronoi图的一个类 2. 代码 VoronoiDiagramGenerator.h #pragma once //Microsoft Visual Studio 2015 Ent ...

  4. Voronoi图及matlab实现

    [题外话:想一想真是...美赛时我预测求爱尔兰的充电站位置分布,画Voronoi图,程序跑了一个小时...]   Voronoi图,又叫泰森多边形或Dirichlet图,它是由一组由连接两邻点直线的垂 ...

  5. 渲染voronoi图

    渲染voronoi图要比计算voronoi图简单. 渲染voronoi图: 方法1: 在pixel shader里,对每一个像素,求哪个种子点到它的距离最近,将此种子点的颜色作为此像素颜色. 当种子点 ...

  6. Arcgis做出voronoi图

    人类第一步,,,我需要给我目前的基站点数据划分voronoi,预期得到每个基站的服务范围 在地统计模块geostatistical analysis 下面的数据探索expore就有Voronoi图 将 ...

  7. 《图像处理实例》 之 Voronoi 图

    Voronoi 图的设计 以下的改进是http://www.imagepy.org/的作者原创,我只是对其理解之后改进和说明,欢迎大家使用这个小软件! 如有朋友需要源工程,请在评论处留邮箱! 说明:类 ...

  8. python opencv 生成验证码

    基本思路是使用opencv来把随机生成的字符,和随机生成的线段,放到一个随机生成的图像中去. 虽然没有加复杂的形态学处理,但是目前看起来效果还不错 尝试生成1000张图片,但是最后只有998张,因为有 ...

  9. opencv生成灰度图并保存

    #include <opencv2/opencv.hpp>#include <iostream> using namespace cv;using namespace std; ...

随机推荐

  1. vi 使用介绍

    参考 <<vi编辑器使用介绍>>文本编辑器有很多,比如图形模式的gedit.kwrite.OpenOffice ,文本模式下的编辑器有vi.vim(vi的增强版本)和nano, ...

  2. nodejs安装教程

    http://www.runoob.com/nodejs/nodejs-install-setup.html nodejs官方下载,之后配置环境path,npm随着nodejs安装,自动安装 查看no ...

  3. 简单的实现web聊天界面,一对一

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. 2017-2018-2 20179204《网络攻防实践》第十一周学习总结 SQL注入攻击与实践

    第1节 研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 1.1 原理 在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统 ...

  5. Jquery : 上下滚动--单行 批量多行 文字图片翻屏【转】

    原文发布时间为:2010-02-01 -- 来源于本人的百度文章 [由搬家工具导入] 注:如果和左右滚动一起使用,则会出现冲突 一单行滚动(ad:http://www.gz138.com) <! ...

  6. SQL Server 2005 无法连接到 127.0.0.1

    [问题描述]如果连接本机的数据库服务器,服务器名称可填: 127.0.0.1或localhost或本机机器全名(比如HOME),有时候用本机机器名可以登录SQL Server 2005,但用127.0 ...

  7. hdu 4990(数学,等比数列求和)

    Reading comprehension Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. hdu 3440(差分约束好题)

    House Man Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. interview ms1 N_Dorm

    判断是否为n回文,比如 a b a 是1 回文, abcdab是2回文. 输入: abcabc|3 这种格式,输出true or false #include <iostream> #in ...

  10. LeetCode OJ-- Flatten Binary Tree to Linked List **

    https://oj.leetcode.com/problems/flatten-binary-tree-to-linked-list/ 二叉树的处理,将二叉树转换成类似一个单链表的东东,并且原地. ...