目录

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

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

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


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

import cv2
import numpy as np
import mxnet as mx
def depth2normal(depth):w,h=depth.shapedx=-(depth[2:h,1:h-1]-depth[0:h-2,1:h-1])*0.5dy=-(depth[1:h-1,2:h]-depth[1:h-1,0:h-2])*0.5dz=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.5dy = mx.nd.elemwise_div(dy, dl) * 0.5 + 0.5dz = mx.nd.elemwise_div(dz, dl) * 0.5 + 0.5return 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 = name
class 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.y-A.y,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 o3d
import 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.002m
print(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_point
normals.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. 点云法向量与点云平面拟合的关系(PCA)

    点云法向量估计的主要思路是对K-近邻的N个点进行平面拟合(平面过N点重心),平面法向量即为所求:所以求法向量就是变相的求拟合平面. 下面我们用最小二乘法求k近邻点云的拟合平面: 当 ||x||=1时, ...

  2. PCL教程指南-估计点云法向量

    PCL教程指南-Estimating Surface Normals in a PointCloud(估计点云法向量) 官方原文档 点云法向指每个点的法向量,它是基于各点所在邻域范围内估计而出,常用方 ...

  3. Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算

    如有错误,恳请指出. 从这一篇博客开始,开始利用Open3d来处理点云数据.之后将围绕点云数据的多种处理方式来记录笔记.本篇博客的内容包括点云的文件格式介绍,点云数据的读取,以及点云的配准与点云的法向 ...

  4. matlab 点云法向量计算和用箭头显示

    matlab 点云法向量计算和用箭头显示 点云法向量估计的方法有很多,应用最广泛和普遍的是,基于平面拟合的法向量计算,也就是基于PCA的法向量计算.当计算某个点的法向量时,首先,找到最近的K个点,然后 ...

  5. 法向量 点云pca_CVPR 2019 | 旷视研究院Oral论文提出GeoNet:基于测地距离的点云分析深度网络...

    全球计算机视觉三大顶会之一 CVPR 2019 (IEEE Conference on Computer Vision and Pattern Recognition)将于 6 月 16-20 在美国 ...

  6. Meshlab读取三维点云、三维点云重建以及三维点云法向量计算

    Meshlab是一个强大的三维模型处理的软件,在三维点云的处理方面也十分强大,不仅仅可以用三维点云重构出三维模型,还可以计算出三维点云每个点的法向量,这在逆向工程和基于三维点云的隐式曲面重建中非常有用 ...

  7. MeshLab学习笔记——三维点云重建以及三维点云法向量计算

    Meshlab是一个强大的三维模型处理的软件,在三维点云的处理方面也十分强大,不仅仅可以用三维点云重构出三维模型,还可以计算出三维点云每个点的法向量,这在逆向工程和基于三维点云的隐式曲面重建中非常有用 ...

  8. 点云法线估计:C++实现

    点云法线估计原理 一.理论基础 1.为什么要求点云的法线 2.如何估计法向量 二.程序实现 三.运行结果 四.法线估计存在的问题 一.理论基础 1.为什么要求点云的法线 表面法线是几何体表面的重要属性 ...

  9. PCL入门系列 —— NormalEstimation、NormalEstimationOMP 基于邻域的点云法线估计

    PCL入门系列 -- NormalEstimation.NormalEstimationOMP 基于邻域的点云法线估计 前言 程序说明 输出结果 代码示例 总结 前言 随着工业自动化.智能化的不断推进 ...

最新文章

  1. DevOps Troubleshooting(1)-运维思想
  2. POJ - 1236 Network of Schools
  3. 016_Redis集群的删除和添加节点
  4. Python利用pymysql连接Mysql数据库
  5. Java学习小程序(8)求数组元素的最大值并放在最后一位
  6. 【 HDU - 1215 】七夕节(数论,约数和公式)
  7. Istio 在阿里云容器服务的部署及流量治理实践
  8. Java常见面试题:常用 GC 调优策略有哪些?
  9. java旋转数组最小值,【剑指offer】7.旋转数组的最小数字
  10. 分享一组我在ins上收集的程序员最爱桌面壁纸
  11. windows10鼠标指针_如何在Windows 10中更轻松地查看鼠标指针
  12. matlab三点绘制三角形,matlab画三角形网格
  13. 事务的四大特性(ACID)
  14. 安装python时系统找不到指定的路径_系统找不到指定的路径【操作步骤】
  15. 问道手游服务器修改密码,问道手游账号安全设置及找回密码教程 玩转问道
  16. 函数的作用、函数的定义及函数的调用
  17. java 后台将英文名 转换成中文名
  18. 深信服技术支持工程师(安全、云计算方向)面试题目
  19. erdas遥感图像几何校正_实验二 ERDAS遥感图像的几何校正
  20. win11任务管理器_win11系统怎么打开任务管理器

热门文章

  1. linux hexdump命令详解
  2. shell脚本调试工具 bashdb
  3. centos下docker1.7 上传文件到容器报错 Error: Path not specified
  4. 内核模式下的注册表操作
  5. 关于Go ROOT 和Go PATH的设置
  6. 安装centos系统时,修改默认网卡名
  7. CentOS7下搭建Nextcloud13.0.5
  8. 添加linux系统调用的两种方式
  9. java getattribute intvalue_Java NodeTree.getAttributeI方法代码示例
  10. php打印文件目录结构,php和java关于目录树(列出某一目录下文件结构)