3D网格模型边界检测(附Python完整代码)

一、概述

近期有需求要对三维网格模型的边界进行检测提取,虽然在meshlab中可以直接显示出三维网格模型的边界,但是经过我各种摸索最后发现好像没有方法能够将显示出的边界信息保存下来,没办法,只能自己手写一个检测方法了。而恰好三维网格模型的边界检测非常简单,只需要根据其拓扑结构,找到只属于一个面的边即为边界。虽然实现出来了,但是在效率上比较低,对点数较多的模型,需要耗费较多的时间,只用几次,我也懒得优化了。

二、代码

没什么好说的,思想很简单,就是找到只属于一个面的边,把这条边包含的点标记为边界点即可。

import time

time_start = time.time()

filename = "*****.ply"

filename1 = "*****.ply"

edges = []
num_edge = []
boundarypoint = []

temp = []

j = 0
pointIdx = 0

print(['3', '5']+['4'])

with open(filename, 'r') as f:
    str = f.readline()
    while str :
        if len(str.strip().split(' ')) == 3 and str.split(' ')[1] == 'vertex':
            pointnum = int(str.split(' ')[2])
            print("number of points is: {}".format(pointnum))

        if str == "end_header\n":
            print(str+"----")
            break
        str = f.readline()

    for i in range(pointnum):
        str = f.readline()

    str = f.readline()
    while str:
        if str.split(' ')[0]=='3':
            edge0 = sorted([str.split(' ')[1], str.split(' ')[2]])
            edge1 = sorted([str.split(' ')[1], str.split(' ')[3]])
            edge2 = sorted([str.split(' ')[2], str.split(' ')[3]])

            if edge0 not in edges:
                edges.append(edge0)
                num_edge.append(1)
            else:
                num_edge[edges.index(edge0)] += 1

            if edge1 not in edges:
                edges.append(edge1)
                num_edge.append(1)
            else:
                num_edge[edges.index(edge1)] += 1

            if edge2 not in edges:
                edges.append(edge2)
                num_edge.append(1)
            else:
                num_edge[edges.index(edge2)] += 1

        str = f.readline()


    for i in range(len(num_edge)):
        if num_edge[i] == 1:
            temp = [int(edges[i][0]), int(edges[i][1])]
            boundarypoint += temp
            j += 1
print(j)
print(boundarypoint)

f.close()


time_end = time.time()

print("time cost {} s".format(time_end-time_start))

with open(filename1,'a') as f1:
        f1.write("""ply
format ascii 1.0
comment VCGLIB generated
element vertex {}
property float x
property float y
property float z
property float nx
property float ny
property float nz
property uchar red
property uchar green
property uchar blue
end_header
""".format(pointnum))
        with open(filename, 'r') as f:
            str = f.readline()
            while str:
                if str == "end_header\n":
                    break
                str = f.readline()

            str = f.readline().strip()
            pointIdx = 0

            for i in range(pointnum):
                f1.write(str)
                if pointIdx in boundarypoint:
                    f1.write(" 0 255 0 \n")
                else:
                    f1.write(" 130 130 130 \n")

                str = f.readline().strip()
                pointIdx += 1

f1.close()
f.close()


三、实验结果

首先利用meshlab对模型检测显示得到的结果为:
在这里插入图片描述
可以看到,meshlab检测得到的边界边的数量为165条。
而通过上述代码检测得到的数量也是165条,所以检测的结果是与meshlab一致的。
在这里插入图片描述
利用代码检测结果如下图:
在这里插入图片描述
检测之后我只保存了点的信息,并没有面和边的信息。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值