我感觉注释写的挺全的,就不多写说明了
原本是用来做无人机拍摄点的,需要的话自己拿走改吧改吧,分享给刚入门的兄弟们

class Obb_show(object):def __init__(self, point, cls=None, clusters=None):"""参数:point:[x,y,z]     shape[n,3]cls:分类码          shape[n]clusters:实例码    shape[n]"""self.point = pointself.cls = cls if self.cls is None:self.cls = point[:,2]         self.clusters = clustersif self.clusters is None:self.clusters = np.ones((point.shape[0]))# 求一下最大边长,画图的时候外边界用xl = np.max(self.point[:,0]) - np.min(self.point[:,0])yl = np.max(self.point[:,1]) - np.min(self.point[:,1])zl = np.max(self.point[:,2]) - np.min(self.point[:,2])self.l = max(xl,yl,zl)/2self.median = np.array([xl,yl,zl])/2 + np.array([np.min(self.point[:,0]),np.min(self.point[:,1]),np.min(self.point[:,2])])def obb(self, point):point1 = point.transpose(1,0) cov_m = np.cov(point1)  # 求协方差矩阵vector, matrix = np.linalg.eig(cov_m)    # 将协方差矩阵生成特征值和特征向量 取特征向量return vector, matrixdef show(self, cls=None, vector_show=False, line=1, mode='box', camrea=False):"""参数:cls:当cls不为None的时候,只显示当前分类码的obb盒vector:为Ture时显示特征向量line: 特征向量的长度 默认1米mode: 两种模式 ‘box’,‘mend’returm:mend_list: list 根据obb盒补充的点           [m,n,3]camera_list: list 拍摄点 每个实例三个拍摄点   [m,3,3]"""mp.figure('3D Scatter')ax3d = mp.gca(projection='3d') # ax3d.set_aspect("equal")ax3d.set_xlabel('X', fontsize=14)ax3d.set_ylabel('Y', fontsize=14)ax3d.set_zlabel('Z', fontsize=14)# 分类显示if cls != None:show_point = self.point[self.cls != cls]self.point = self.point[self.cls == cls]self.clusters = self.clusters[self.cls == cls]else:show_point = self.pointif mode == 'box':ax3d.scatter(self.point[:,0], self.point[:,1], self.point[:,2], c=self.cls[self.cls == cls],s=0.1, alpha=0.5, cmap='jet')  ax3d.scatter(show_point[:,0], show_point[:,1], show_point[:,2], c=self.cls[self.cls != cls],s=0.1, alpha=0.5, cmap='jet')# 补点用的容器mend_list = []camera_list = []for cluster in np.unique(self.clusters):clu_point = self.point[self.clusters == cluster]# 求特征矩阵vector, matrix = self.obb(clu_point)# print(matrix)# 刚性变换new = np.matmul(clu_point,matrix)# 求顶点xmin = np.min(new[:,0])ymin = np.min(new[:,1])zmin = np.min(new[:,2])xmax = np.max(new[:,0])ymax = np.max(new[:,1])zmax = np.max(new[:,2])top_list = np.array([[xmin, ymin, zmin],[xmin, ymin, zmax],[xmin, ymax, zmin],[xmin, ymax, zmax],[xmax, ymin, zmin],[xmax, ymin, zmax],[xmax, ymax, zmin],[xmax, ymax, zmax]])# 拍摄点if camrea:camera_point = np.array([[xmin,(ymin+ymax)/2,(zmin+zmax)/2],[(xmin+xmax)/2,(ymin+ymax)/2,(zmin+zmax)/2],[xmax,(ymin+ymax)/2,(zmin+zmax)/2]])camera_point = np.matmul(camera_point,matrix.T)ax3d.scatter(camera_point[:,0], camera_point[:,1], camera_point[:,2], c="black",s=20, alpha=1)  camera_list.append(camera_point)if mode == 'mend':# 补点insulator_long = np.abs(xmax-xmin)insulator_width = np.abs(ymax-ymin)insulator_high = np.abs(zmax-zmin)spacing = 0.5p_num_long = insulator_long / spacing + 1p_num_width = insulator_width / (spacing/1.5) + 1p_num_high = insulator_high / (spacing/1.5) + 1a = np.linspace(xmin,xmax,p_num_long)b = np.linspace(ymin,ymax,p_num_width)c = np.linspace(zmin,zmax,p_num_high)xxx = np.empty((0,3))for i in a:for j in b:for k in c:aaa = np.array([[i,j,k]])xxx = np.vstack((xxx,aaa))xxx = np.matmul(xxx,matrix.T)ax3d.scatter(xxx[:,0], xxx[:,1], xxx[:,2], c="red",s=1, alpha=0.3)  mend_list.append(xxx)elif mode == 'mend_round':# 圆柱补点insulator_long = np.abs(xmax-xmin)insulator_width = np.abs(ymax-ymin)insulator_high = np.abs(zmax-zmin)distance = np.mean([insulator_width,insulator_high]) *0.3   # 调参 柱状体半径spacing = 0.3                                           # 调参 补点间隔p_num_long = insulator_long / spacing + 1x = np.linspace(xmin,xmax,p_num_long)theta = np.arange(0, 2*np.pi, 0.5)y = distance * np.cos(theta) + np.mean([ymax,ymin])z = distance * np.sin(theta) + np.mean([zmax,zmin])p = np.vstack((y,z))p = np.tile(p,x.shape[0]).T  x = x.repeat(y.shape[0]).reshape(-1,1)p = np.hstack((x.reshape(-1,1),p))p = np.matmul(p,matrix.T)ax3d.scatter(p[:,0], p[:,1], p[:,2], c="red",s=1, alpha=0.3) mend_list.append(p)elif mode == 'box':# 刚性变换逆变换top_list = np.matmul(top_list,matrix.T)# print(top_list[-1]-top_list[0],cluster)# 画obb包围盒框ax3d.plot3D(*zip(top_list[0],top_list[1]), color="red")ax3d.plot3D(*zip(top_list[1],top_list[3]), color="red")ax3d.plot3D(*zip(top_list[3],top_list[2]), color="red")ax3d.plot3D(*zip(top_list[2],top_list[0]), color="red")ax3d.plot3D(*zip(top_list[4],top_list[5]), color="red")ax3d.plot3D(*zip(top_list[5],top_list[7]), color="red")ax3d.plot3D(*zip(top_list[7],top_list[6]), color="red")ax3d.plot3D(*zip(top_list[6],top_list[4]), color="red")ax3d.plot3D(*zip(top_list[0],top_list[4]), color="red")ax3d.plot3D(*zip(top_list[1],top_list[5]), color="red")ax3d.plot3D(*zip(top_list[2],top_list[6]), color="red")ax3d.plot3D(*zip(top_list[3],top_list[7]), color="red")# obb盒的顶点# ax3d.scatter(top_list[:,0],top_list[:,1], top_list[:,2], s=0.5, alpha=1, color='black')# # 画特征向量if vector_show:clu_mean = [np.mean(clu_point[:,0]),np.mean(clu_point[:,1]),np.mean(clu_point[:,2])]ax3d.plot3D(*zip(clu_mean, clu_mean+matrix[:,0]*line), color="r")ax3d.plot3D(*zip(clu_mean, clu_mean+matrix[:,1]*line), color="g")ax3d.plot3D(*zip(clu_mean, clu_mean+matrix[:,2]*line), color="b")ax3d.plot3D(*zip(clu_mean, clu_mean+np.sum(matrix,axis=0)*line), color="b")# 画外边界框r = [-self.l, self.l]for s, e in combinations(np.array(list(product(r, r, r))), 2):s = s + self.mediane = e + self.medianif np.sum(np.abs(s-e)) == r[1]-r[0]:ax3d.plot3D(*zip(s, e), color="b")mp.show()return mend_list, camera_list

点云obb盒显示 python相关推荐

  1. 双目三维重建系统(双目标定+立体校正+双目测距+点云显示)Python

    双目三维重建系统(双目标定+立体校正+双目测距+点云显示)Python 目录 双目三维重建系统(双目标定+立体校正+双目测距+点云显示)Python 1.项目结构 2. Environment 3.双 ...

  2. 爆肝5万字❤️Open3D 点云数据处理基础(Python版)

    Open3D 点云数据处理基础(Python版) 文章目录 1 概述 2 安装 2.1 PyCharm 与 Python 安装 2.3 Anaconda 安装 2.4 Open3D 0.13.0 安装 ...

  3. centos 安装百度云/百度网盘Python客户端

    通过pip来安装:pip install bypy (支持Python 2.7+, 3.3+) centos 6.5python版本为2.6的,这里我们先要安装python2.7 1.安装 sqlit ...

  4. 词云可视化:四行Python代码轻松上手到精通

    词云可视化:四行Python代码轻松上手到精通 文章目录 词云可视化:四行Python代码轻松上手到精通 本课概要 关于本课程 `粉丝答疑交流QQ群:953712961` `微信赞赏码` 不需要写代码 ...

  5. python2.7安装包百度云,centos 安装百度云/百度网盘Python客户端

    通过pip来安装:pip install bypy (支持Python 2.7+, 3.3+) centos 6.5python版本为2.6的,这里我们先要安装python2.7 1.安装 sqlit ...

  6. python海龟图画龙珠_阿里云天池龙珠计划——Python基础入门第2课:变量和赋值...

    阿里云天池龙珠计划--Python基础入门第2课:变量和赋值 [我是测试题2]下面这段代码的运行结果是什么? # 运行一下结果就出来了 a = "hello" b = " ...

  7. python安装 百度网盘-centos 安装百度云/百度网盘Python客户端

    通过pip来安装:pip install bypy (支持Python 2.7+, 3.3+) centos 6.5python版本为2.6的,这里我们先要安装python2.71.安装 sqlite ...

  8. Trimble RealWorks处理点云数据(五)之点云裁剪盒模式

    Trimble RealWorks处理点云数据(四)之点云外部分类 效果 背景 有时候我们会扫描室内的点云数据,而从外面是比较难看到室内的情况的,而点云又不能通过透视的方式直接进入室内观察,这时候就可 ...

  9. python怎么设置文字云_超燃的文字云效果,用Python就能轻松get!

    原标题:超燃的文字云效果,用Python就能轻松get! 本文转载自公众号:数据森麟(ID:shujusenlin) 作者:叶庭云 链接:https://blog.csdn.net/fyfugoyfa ...

最新文章

  1. python迷宫问题求最短路径_用栈求解迷宫问题的所有路径及最短路径程序
  2. 散粉在哪个步骤用_美妆大神的定妆大法竟然这么好用?用完都不想卸妆了
  3. echarts 堆叠树状图排序
  4. 怎么确定Oracle客户端安装成功
  5. 20220207-CTF-MISC-第11题--- base64隐写--附带脚本
  6. pom.xml详细说明
  7. win 10 java 安装_win10---Java安装及环境变量配置
  8. Java中的一些坑,汇总篇(2万字)
  9. 帝国CMS默认编辑器插入代码插件
  10. mysql 名次语法规则_基于sql语句的一些常用语法积累总结
  11. 智能排班系统、班次、班表、考勤、年假、调休、审批、请假、培训、值班、换班、加班、工时、自动排班、智能预测、人力需求预测、授权、团队、锁定量排、规则权重设置、菜单、角色、数据监控、工作台、axure
  12. JavaScrip节点属性-访问子节点
  13. 剑指Offer:面试题31——连续子数组的最大和(java实现)
  14. 从APNIC获取中国IP地址列表
  15. 移动端UML图应用之UML结构图——包图、部署图和组件图
  16. 一键清理系统垃圾文件
  17. 11尺寸长宽 iphone_2019新发布iPhone 11、iPhone 11 Pro、iPhone 11 Pro Max尺寸规格对比
  18. JAVA家庭记账软件
  19. RTMP、RTSP、m3u8、flv 区别及含义
  20. Linux bash命令入门

热门文章

  1. 如何制作RJ45超五类线缆?六个步骤搞定!
  2. 【毕业设计】基于单片机的宠物自动喂食系统 - 物联网 嵌入式 单片机 宠物喂食系统 宠物投食系统
  3. 部署web项目在腾讯云当中
  4. 人工智能大战苹果缺席 保护用户隐私拖慢其步伐
  5. 游戏开发团队及工作流程
  6. hdoj-2036题解-向量积法求任意多边形面积
  7. word转换为html为什么图片显示不了,word插入html 转换为docx图片不显示问题
  8. 上海Oracle用户组我的页面
  9. drop、truncate和delete的区别
  10. 【流媒体性能测试常用指标】