谁对opencv里面的delaunay三角剖分方法比较熟悉的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁对opencv里面的delaunay三角剖分方法比较熟悉的相关的知识,希望对你有一定的参考价值。
具体什么不太懂,不过我收藏了一个以前别人讲这方面的东西,你看看,希望对你有帮助。Delaunay三角网是俄国数学家B.Delaunay于1934年发现的。关于Delaunay三角网构建的研究有许多,但由于本课题具有数据量大的特征,不宜直接沿用已有构建方法,笔者针对本课题数据特征,研究获得了适应本课题,速度较快的构建方法。Delaunay三角网有一个特性,每个三角网形成的外接圆都不包含其他参考点。利用这一个性质,我们可以直接构成Delaunay三角网:
一、建立第一个三角形
1、判断用来建立TIN的总脚点数,小于3则报错退出。
2、第一点的选择:
链表的第一节点,命名为Pt1;
3、第二点的选择:
A.非Pt1点; B.距Pt1最近
命名为Pt2
4、第三点的选择
A.非Pt1,Pt2点;
B.与Pt1,Pt2点组成的三角形的外接圆内无其他节点;
C.与Pt1,Pt2组成的三角形中的角Pt1Pt3Pt2最大。
命名为Pt3
5、生成三边,加入边表
6、生成第一个三角形,组建三角形表
二、扩展TIN
1、从边表头取一边,要求:该边flag标志为假(只在一个三角形中)
2、从点链表中搜索一点,要求:
A、与边中的Pixel3在边的异侧;
B、该点与边组成的三角形的外接圆内无其他点
C、满足上面两条件的点中角Pt1Pt3Pt2最大的点为Pt3。
3、判断新生成的边,如果边表中没有,则加入边表尾,设定标志flag为假,如果有,则设定该边flag为真。
4、将生成的三角形假如三角形表
5、设定选中的边的标志flag为真
6、转至1,直至边表边的标志flag全部为真。
数据结构:
struct Pixel //脚点数据
double x,y,z,g;
bool flag;
;
struct List //数据链表
Pixel *pixel;
List *next;
;
struct Line //三角形边
Pixel *pixel1; //三角形边一端点
Pixel *pixel2; //三角形边另一端点
Pixel *pixel3; //三角形边所对顶点
bool flag;
;
struct Linelist //三角形边表
Line *line;
Linelist *next;
;
struct Triangle //三角形表
Line *line1;
Line *line2;
Line *line3;
Triangle *next;
;
以下是我程序中关于建网的部分:
// DelaunayTIN.cpp: implementation of the CDelaunayTIN class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Reconstruction.h"
#include "DelaunayTIN.h"
#include "MyMath.h"
#include <math.h>
#include "ListControl.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDelaunayTIN::CDelaunayTIN()
CDelaunayTIN::~CDelaunayTIN()
/////////////////////////////////////////////////////////////////////////////
//函数名: CreateDelaunayTIN
//编写者: Polaris
//参考资料:
//功能: 用给定的数据链表数据,组建Delaunay不规则三角网
//输入参数:数据链表list;区域范围(XMin,YMin),(XMax,YMax)
//输出参数:不规则三角网首三角形地址
//备注:
/////////////////////////////////////////////////////////////////////////////
struct Triangle * CDelaunayTIN::CreateDelaunayTIN(List *list)
//组建第一个三角形
CMyMath MyMath;
CListControl ListControl;
struct List *node;
struct Pixel *pt1,*pt2,*pt3;
bool flag;
struct Triangle *TIN;
pt1=list->pixel;
pt2=list->next->pixel;
node=list->next->next;
while(node!=NULL)
if(MyMath.Calculate2PtDistanceIn3D
(pt1->x,pt1->y,pt1->z,node->pixel->x,node->pixel->y,node->pixel->z)
<MyMath.Calculate2PtDistanceIn3D
(pt1->x,pt1->y,pt1->z,pt2->x,pt2->y,pt2->z))
pt2=node->pixel;
node=node->next;
node=list->next;
pt3=NULL;
while(node!=NULL)
if(node->pixel==pt1 || node->pixel==pt2)
node=node->next;
continue;
if(pt3==NULL)
pt3=node->pixel;
else
if((pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,node->pixel->x,node->pixel->y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,node->pixel->x,node->pixel->y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt2->x,pt2->y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,node->pixel->x,node->pixel->y)*MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,node->pixel->x,node->pixel->y))
<(pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt3->x,pt3->y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pt3->x,pt3->y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt2->x,pt2->y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1->x,pt1->y,pt3->x,pt3->y)*MyMath.Calculate2PtDistanceIn2D(pt2->x,pt2->y,pt3->x,pt3->y)))
pt3=node->pixel;
node=node->next;
//LineList
Linelist *linehead,*linenode,*linelast;
Line *ln1,*ln2,*ln3;
linenode=new Linelist;
linenode->line=new Line;
linenode->line->pixel1=pt1; 参考技术A Delaunay三角剖分是1934年发明的将空间点连接为三角形,使得所有三角形中最小角最大的一个技术。
如果你熟悉计算机图形学,你便会知道Delaunay三角剖分是变现三维形状的基础。如果我们在三维空间渲染一个,我们可以通过这个物体的投影来建立二维视觉图,并用二维Delaunay三角剖分来分析识别该物体,或者将它与实物相比较。Delaunay剖分是连接计算机视觉与计算机图形学的桥梁。然而使用OpenCV实现三角剖分的不足之处就是OpenCV只实现了二维的Delaunay剖分。如果我们能够对三维点进行三角剖分,也就是说构成立体视觉,那么我们可以在三维的计算机图形和计算机视觉进行无缝的转换。然而二维三角剖分通常用于计算机视觉中标记空间目标的特征或运动场景跟踪,目标识别,或两个不同的摄像机的场景匹配(如图从立体图像中获得深度信息)。
详情见http://m.blog.csdn.net/article/details?id=45598769
来自 voronoi 镶嵌的 Delaunay 三角剖分
【中文标题】来自 voronoi 镶嵌的 Delaunay 三角剖分【英文标题】:Delaunay triangulation from voronoi tessellation 【发布时间】:2021-11-23 07:39:19 【问题描述】:我想知道如何进行 Delaunay 三角测量来找到 voronoi tessellation 形成的细胞
以下是我用来生成 voronoi 细胞的代码。
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d
import shapely.geometry
import shapely.ops
points = np.random.random((20, 2))
vor = Voronoi(points)
fig = voronoi_plot_2d(vor)
plt.show()
有人可以通过申请帮助我找到手机连接吗 德劳内三角剖分?
【问题讨论】:
【参考方案1】:vor.ridge_points
是一个包含所有 Delaunay 边的 Nx2 数组。这些值是输入数组points
的索引。例如,一条边从点号vor.ridge_points[0,0]
到点号vor.ridge_points[0,1]
。
【讨论】:
非常感谢。我们可以将points
的索引添加到fig
并绘制delaunay 边缘吗?
我在这里有点困惑。我想在 voronoi 单元的点之间绘制 Delaunay 边,即 voronoi_plot_2d(vor, show_vertices=True, show_points=True)
在 show_points
= 1 时显示点。现在我想将这些点作为节点,然后绘制 Delaunay 边。
我想生成这样的图形***.com/q/59869376/8281509。
@Natasha 你试过在这个数组中列举的每对点之间画线吗?线的两个端点应该是points[vor.ridge_points[i,0]]
和points[vor.ridge_points[i,1]]
。
谢谢。实际上,我错误地认为点是 Voronoi 单元的顶点。现在,我很清楚。我可以再问一个问题吗?我正在寻找可用于识别细胞连通性的生物细胞的成像数据。如果DIPlib
有可用的测试样本,您能否分享一些参考链接?以上是关于谁对opencv里面的delaunay三角剖分方法比较熟悉的的主要内容,如果未能解决你的问题,请参考以下文章
在 RGB 通道而不是最终图像上应用 Delaunay 三角剖分