首页 > 编程知识 正文

最小二乘平面拟合点云法向量,法向量 平面

时间:2023-05-05 23:56:04 阅读:272756 作者:2953

目录

单通道深度图像,转三通道法向图像

opencv 平面法向量_任意两平面求夹角

点云3种法向量估计方法及可视化


单通道深度图像,转三通道法向图像

import cv2import numpy as npimport mxnet as mxdef depth2normal(depth):    w,h=depth.shape    dx=-(depth[2:h,1:h-1]-depth[0:h-2,1:h-1])*0.5    dy=-(depth[1:h-1,2:h]-depth[1:h-1,0:h-2])*0.5    dz=mx.nd.ones((w-2,h-2))    dl = mx.nd.sqrt(mx.nd.elemwise_mul(dx, dx) + mx.nd.elemwise_mul(dy, dy) + mx.nd.elemwise_mul(dz, dz))    dx = mx.nd.elemwise_div(dx, dl) * 0.5 + 0.5    dy = mx.nd.elemwise_div(dy, dl) * 0.5 + 0.5    dz = mx.nd.elemwise_div(dz, dl) * 0.5 + 0.5    return np.concatenate([dy.asnumpy()[np.newaxis,:,:],dx.asnumpy()[np.newaxis,:,:],dz.asnumpy()[np.newaxis,:,:]],axis=0)if __name__ == '__main__':    depth=cv2.imread("depth.png",0)    normal=np.array(depth2normal(mx.nd.array(depth))*255)    normal = cv2.cvtColor(np.transpose(normal, [1, 2, 0]), cv2.COLOR_BGR2RGB)             cv2.imwrite("normal.png",normal.astype(np.uint8))


原文链接:https://blog.csdn.net/muyouhang/article/details/103649888

opencv 平面法向量_任意两平面求夹角 import math#引入math模块 计算角度用class point(object):#定义空间点类"""docstring for point"""def __init__(self,x,y,z,name):self.x = xself.y = yself.z = zself.name = nameclass plane(object):#定义平面类"""docstring for plane"""def __init__(self, A,B,C,name):self.points=[A,B,C]#一个平面三个点self.points_name=[A.name,B.name,C.name]#点的名字self.name = name#平面的名字self.n=[]#平面的法向量def isplane(self):#判断这三个点是否能构成平面coors=[[],[],[]]#三个点的xyz坐标分别放在同一个列表用来比较for _point in self.points:#对于每个点coors[0].append(_point.x)coors[1].append(_point.y)coors[2].append(_point.z)for coor in coors:if coor[0]==coor[1]==coor[2]:#如果三个点的x或y或z坐标相等 则不能构成平面return print('Points:',*self.points_name,'cannot form a plane')def normal(self):#获得该平面的法向量self.isplane()#获得该平面的法向量前提是能构成平面A,B,C=self.points#对应三个点AB=[B.x-A.x,魔幻的飞机,B.z-A.z]#向量ABAC=[C.x-A.x,C.y-A.y,C.z-A.z]#向量ACB1,B2,B3=AB#向量AB的xyz坐标C1,C2,C3=AC#向量AC的xyz坐标self.n=[B2*C3-C2*B3,B3*C1-C3*B1,B1*C2-C1*B2]#已知该平面的两个向量,求该平面的法向量的叉乘公式def angle(self,P2):#两个平面的夹角x1,y1,z1=self.n#该平面的法向量的xyz坐标x2,y2,z2=P2.n#另一个平面的法向量的xyz坐标cosθ=((x1*x2)+(y1*y2)+(z1*z2))/(((x1**2+y1**2+z1**2)**0.5)*((x2**2+y2**2+z2**2)**0.5))#平面向量的二面角公式degree=math.degrees(math.acos(cosθ))if degree>90:#二面角∈[0°,180°] 但两个平面的夹角∈[0°,90°]degree=180-degreereturn print('平面',self.name,P2.name,'的夹角为'+str(round(degree,5))+'°')#round(数值,四舍五入位数) math.degrees(弧度)将弧度转换为角度 math.acos(数值)返回该数值的反余弦弧度值#测试print('-'*25)A=point(0,0,1,'A')#六个点B=point(1,0,1,'B')C=point(1,1,0,'C')P1=plane(A,B,C,'P1')#p1平面D=point(0,1,1,'D')E=point(1,1,1,'E')F=point(0.5,0,0,'F')P2=plane(D,E,F,'P2')#p2平面P1.normal()#求平面p1 p2的法向量P2.normal()P1.angle(P2)#求平面p1 p2的夹角print('-'*25)G=point(2,0,0,'G')#六个点H=point(0,0,0,'H')I=point(0,3,3**0.5,'I')P3=plane(G,H,I,'P3')#p3平面J=point(2/3,4/3,0,'J')K=point(0,0,0,'K')L=point(0,3,3**0.5,'L')P4=plane(J,K,L,'P4')#p4平面P3.normal()#分别求平面p3 p4的法向量P4.normal()P3.angle(P4)#求平面p3 p4的夹角print('-'*25)M=point(0,1,0,'M')#六个点N=point(0,0,0,'N')O=point(1,1,1,'O')P5=plane(M,N,O,'P5')#p1平面Q=point(0,0,2,'Q')R=point(0,0,0,'R')S=point(1,1,1,'S')P6=plane(Q,R,S,'P6')#p2平面P5.normal()#求平面p1 p2的法向量P6.normal()P5.angle(P6)#求平面p1 p2的夹角print('-'*25)T=point(12.6,-1,63,'T')#六个点U=point(0,7,8,'U')V=point(11,9,83.2,'V')P7=plane(T,U,V,'P7')#p1平面W=point(45,2,13,'W')X=point(9,10,-56,'X')Y=point(0.5,-7,1,'Y')P8=plane(W,X,Y,'P8')#p2平面P7.normal()#求平面p1 p2的法向量P8.normal()P7.angle(P8)#求平面p1 p2的夹角

原文链接:https://blog.csdn.net/weixin_36313588/article/details/112189888

点云3种法向量估计方法及可视化 1)点云读取可视化2)下采样可视化3)法向量三种估计方式(K近邻估计,半径近邻估计,混合搜索估计)4)点云每个点对应的法向量点存储及可视化5)法向量点和原始点云同时可视化6) 源码

1)点云读取可视化

原始点云:

2)下采样可视化

下采样:

3)法向量三种估计方式(K近邻估计,半径近邻估计,混合搜索估计)

K近邻估计法向量并可视化:


混合搜索近邻估计可视化

4)点云每个点对应的法向量点存储及可视化

法向量对应的点可视化:

5)法向量点和原始点云同时可视化

原始点云灰色,法向量点绿色

6) 源码 # @Description: <Open3D估计法向量,可视化,存储为文件>import open3d as o3dimport ospath = os.path.abspath(os.path.join(os.getcwd(), "../"))path = path + "/pcds/bunny.pcd"normalPath = path.replace(".pcd", "_normal.pcd")print(path)print(normalPath)print("Load a pcd point cloud, print it, and render it")pcd = o3d.io.read_point_cloud(path)pcd.paint_uniform_color([0.5, 0.5, 0.5]) # 把所有点渲染为灰色(灰兔子)print(pcd) # 输出点云点的个数# print(o3d.np.asarray(pcd.points)) # 输出点的三维坐标o3d.visualization.draw_geometries([pcd], "Open3D origin points", width=800, height=600, left=50, top=50, point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)print("Downsample the point cloud with a voxel of 0.002")downpcd = pcd.voxel_down_sample(voxel_size=0.002) # 下采样滤波,体素边长为0.002mprint(downpcd)o3d.visualization.draw_geometries([downpcd], "Open3D downsample points", width=800, height=600, left=50, top=50, point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)print("Recompute the normal of the downsampled point cloud")# 混合搜索 KNN搜索 半径搜索# downpcd.estimate_normals(# search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=20)) # 计算法线,搜索半径1cm,只考虑邻域内的20个点downpcd.estimate_normals( search_param=o3d.geometry.KDTreeSearchParamKNN(knn=20)) # 计算法线,只考虑邻域内的20个点# downpcd.estimate_normals(# search_param=o3d.geometry.KDTreeSearchParamRadius(radius=0.01)) # 计算法线,搜索半径1cm,只考虑邻域内的20个点o3d.visualization.draw_geometries([downpcd], "Open3D normal estimation", width=800, height=600, left=50, top=50, point_show_normal=True, mesh_show_wireframe=False, mesh_show_back_face=False) # 可视化法线print("Print a normal vector of the 0th point")print(downpcd.normals[0]) # 输出0点的法向量值print("Print the normal vectors of the first 10 points")print(o3d.np.asarray(downpcd.normals)[:10, :]) # 输出前10个点的法向量# std::vector<Eigen::Vector3d> with 381 elements. 转换为nparry 以打印访问# normals = o3d.np.asarray(downpcd.normals)# print(normals)# 可视化法向量的点,并存储法向量点到文件normal_point = o3d.utility.Vector3dVector(downpcd.normals)normals = o3d.geometry.PointCloud()normals.points = normal_pointnormals.paint_uniform_color((0, 1, 0)) # 点云法向量的点都以绿色显示o3d.visualization.draw_geometries([pcd, normals], "Open3D noramls points", width=800, height=600, left=50, top=50, point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)o3d.io.write_point_cloud(normalPath, normals)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。