OpenCV中Delaunay三角网算法例子

#include <opencv2/opencv.hpp>
#include <vector>

using namespace cv;
using namespace std;

typedef struct _TRIANGLE_DESC_
{
	Point pt1, pt2, pt3;
	_TRIANGLE_DESC_(const Point _pt1, const Point _pt2, const Point _pt3):
		pt1(_pt1), pt2(_pt2), pt3(_pt3){}
}TRIANGLE_DESC;

vector<TRIANGLE_DESC> delaunayAlgorithm(const Rect boundRc,const vector<Point>& points)
{
	if (points.empty())
	{
		return vector<TRIANGLE_DESC>();
	}
	vector<TRIANGLE_DESC> result;

	vector<Vec6f> _temp_result;
	Subdiv2D subdiv2d(boundRc);
	for (const auto point : points)
	{
		subdiv2d.insert(Point2f((float)point.x, (float)point.y));
	}
	subdiv2d.getTriangleList(_temp_result);

	for (const auto _tmp_vec : _temp_result)
	{
		Point pt1((int)_tmp_vec[0], (int)_tmp_vec[1]);
		Point pt2((int)_tmp_vec[2], (int)_tmp_vec[3]);
		Point pt3((int)_tmp_vec[4], (int)_tmp_vec[5]);
		result.push_back(TRIANGLE_DESC(pt1, pt2, pt3));
	}
	return result;
}

int main(int argc, char* argv[])
{
	const int width = 400;
	const int height = 400;
	Mat srcImg(height, width, CV_8UC3, Scalar(255,255,255));
	const vector<Point> testPoints = {
		Point(23, 45), Point(243, 145), Point(308, 25),
		Point(180, 230), Point(343, 145), Point(108, 25)
	};
	for (const auto point : testPoints)
	{
		circle(srcImg, point, 1, Scalar(0), 2);
	}

	//
	const Rect pageRc(0, 0, width, height);
	const auto triangles = delaunayAlgorithm(pageRc,testPoints);
	for (const auto triangle : triangles)
	{
		line(srcImg, triangle.pt1, triangle.pt2, Scalar(255, 0, 0));
		line(srcImg, triangle.pt1, triangle.pt3, Scalar(255, 0, 0));
		line(srcImg, triangle.pt2, triangle.pt3, Scalar(255, 0, 0));
	}
	imshow("src", srcImg);
	waitKey(0);

	return 0;
}

  

时间: 2024-10-04 17:31:34

OpenCV中Delaunay三角网算法例子的相关文章

目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)

在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行opencv中给的sample并稍加修改. Camshift函数的原型为:RotatedRect CamShift(InputArray probImage, Rect& window, TermCriteria criteria). 其中probImage为输入图像直方图的反向投影图,window为要

opencv中使用 SURF算法匹配的遇到的问题

错误 1 error LNK2019: 无法解析的外部符号 "public: __thiscall cv::SURF::SURF(double,int,int,bool,bool)" ([email protected]@@[email protected][email protected]),该符号在函数 _main 中被引用错误 2 error LNK1120: 1 个无法解析的外部命令 解决方法:缺少函数库.在连接器--输入--附加依赖项里面加上两个库:opencv_nonfre

c++opencv中线条细化算法

要达到的效果就是将线条尽量细化成单像素,按照论文上的Hilditch算法试了一下,发现效果不好,于是自己尝试着写了一下细化的算法,基本原理就是从上下左右四个方向向内收缩. 1.先是根据图片中的原则确定了以下16种情况 2.调试过后发现,迭代次数多了之后,原来连接着的线条会断开,分析原因如下图 3.修改了一下判断条件 4.调试过后发现还是会出现断的地方,再次分析原因如下图 5.又加了判断条件,如下图 最终实现的效果如下   对比图 对规则曲线的效果比较好 但是圆的效果不太好,有待改进 附上代码,测

图像处理之 opencv 学习---opencv 中的常用算法

http://blog.csdn.net/lindazhou2005/article/details/1534234 文中有提到鲁棒性 http://blog.csdn.net/chary8088/article/details/24935559

opencv3中的机器学习算法之:EM算法

不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmeans聚类(输入样本数据,输出样本数据的标注).实际上,高斯混和模型GMM和kmeans都是EM算法的应用. 在opencv3.0中,EM算法的函数是trainEM,函数原型为: bool trainEM(InputArray samples, OutputArray logLikelihoods=n

[OpenCV-Python] OpenCV 中的图像处理 部分 IV (六)

部分 IVOpenCV 中的图像处理 23 图像变换 23.1 傅里叶变换目标本小节我们将要学习: ? 使用 OpenCV 对图像进行傅里叶变换 ? 使用 Numpy 中 FFT(快速傅里叶变换)函数 ? 傅里叶变换的一些用处 ? 我们将要学习的函数有:cv2.dft(),cv2.idft() 等原理 傅里叶变换经常被用来分析不同滤波器的频率特性.我们可以使用 2D 离散傅里叶变换 (DFT) 分析图像的频域特性.实现 DFT 的一个快速算法被称为快速傅里叶变换(FFT).关于傅里叶变换的细节知

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

部分 V图像特征提取与描述 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相信你们大多数人都玩过拼图游戏吧.首先你们拿到一张图片的一堆碎片,要做的就是把这些碎片以正确的方式排列起来从而重建这幅图像.问题是,你怎样做到的呢?如果把你做游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了.如果计算机可以玩拼图,我们就可以给计算机一大堆自然图片,然后就可以让计算机把它拼成一张大图了.如果计算机可以自动拼接自然图片,那我们是不是可

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)

部分 V图像特征提取与描述 34 角点检测的 FAST 算法 目标 ? 理解 FAST 算法的基础 ? 使用 OpenCV 中的 FAST 算法相关函数进行角点检测原理 我们前面学习了几个特征检测器,它们大多数效果都很好.但是从实时处理的角度来看,这些算法都不够快.一个最好例子就是 SLAM(同步定位与地图构建),移动机器人,它们的计算资源非常有限.为了解决这个问题,Edward_Rosten 和 Tom_Drummond 在 2006 年提出里 FAST 算法.我们下面将会对此算法进行一个简单

[OpenCV-Python] OpenCV 中视频分析 部分 VI

部分 VI视频分析 39 Meanshift 和 和 Camshift 目标 ? 本节我们要学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象39.1 Meanshift Meanshift 算法的基本原理是和很简单的.假设我们有一堆点(比如直方图反向投影得到的点),和一个小的圆形窗口,我们要完成的任务就是将这个窗口移动到最大灰度密度处(或者是点最多的地方).如下图所示: 初始窗口是蓝色的"C1",它的圆心为蓝色方框"C1_o",而窗