python VTK画3D方框

根据两个三维点坐标画出方框,用于框定三维目标。最近做3D目标检测,想要在三维空间展示检测效果,使用vtkBoundingBox 只能标定边界线,用这种方法可以根据给出的检测框坐标,画出方框。

def draw3dBox(pointA,pointB):
    minX, minY, minZ = pointA
    maxX, maxY, maxZ = pointB

    boxGridPoints = vtk.vtkPoints()
    boxGridPoints.SetNumberOfPoints(8)
    boxGridPoints.SetPoint(0, minX, maxY, minZ)
    boxGridPoints.SetPoint(1, maxX, maxY, minZ)
    boxGridPoints.SetPoint(2, maxX, minY, minZ)
    boxGridPoints.SetPoint(3, minX, minY, minZ)

    boxGridPoints.SetPoint(4, minX, maxY, maxZ)
    boxGridPoints.SetPoint(5, maxX, maxY, maxZ)
    boxGridPoints.SetPoint(6, maxX, minY, maxZ)
    boxGridPoints.SetPoint(7, minX, minY, maxZ)

    boxGridCellArray = vtk.vtkCellArray()
    for i in range(12):
        boxGridCell = vtk.vtkLine()
        if i < 4:
            temp_data = (i + 1) if (i + 1) % 4 != 0 else 0
            boxGridCell.GetPointIds().SetId(0, i)
            boxGridCell.GetPointIds().SetId(1, temp_data)
        elif i < 8:
            temp_data = (i + 1) if (i + 1) % 8 != 0 else 4
            boxGridCell.GetPointIds().SetId(0, i)
            boxGridCell.GetPointIds().SetId(1, temp_data)
        else:
            boxGridCell.GetPointIds().SetId(0, i % 4)
            boxGridCell.GetPointIds().SetId(1, i % 4 + 4)
        boxGridCellArray.InsertNextCell(boxGridCell)

    boxGridData = vtk.vtkPolyData()
    boxGridData.SetPoints(boxGridPoints)
    boxGridData.SetLines(boxGridCellArray)
    boxGridMapper = vtk.vtkPolyDataMapper()
    boxGridMapper.SetInputData(boxGridData)
    return boxGridMapper
    
if __name__ == '__main__':
    pointA = [-1, -0.6, -1]
    pointB = [1, 0.6, 1]
    boxGridMapper = draw3dBox(pointA, pointB)
    actor = vtk.vtkActor()
    actor.SetMapper(boxGridMapper)
    
    # 数据源 圆柱
    cylinder = vtk.vtkCylinderSource()
    cylinder.SetHeight(1.0)
    cylinder.SetRadius(1.0)
    cylinder.SetResolution(360)
    print("高、半径、面:", cylinder.GetHeight(), cylinder.GetRadius(), cylinder.GetResolution())
    # 映射
    cylinderMapper = vtk.vtkPolyDataMapper()
    cylinderMapper.SetInputConnection(cylinder.GetOutputPort())

    # 绘制对象/演员
    cylinderActor = vtk.vtkActor()
    # 绘制对象添加映射器
    cylinderActor.SetMapper(cylinderMapper)
    # 添加颜色
    colors = vtk.vtkNamedColors()
    actor.GetProperty().SetColor(0.67,1,1)
    # 绘制器
    renderer = vtk.vtkRenderer()
    # 绘制器添加对象
    renderer.AddActor(cylinderActor)
    renderer.AddActor(actor)
    # 绘制器设置背景
    renderer.SetBackground(0.1, 0.2, 0.4)
    print("Renderer bg:", renderer.GetBackground())
    # 绘制窗口
    renWin = vtk.vtkRenderWindow()
    # 绘制窗口添加绘制器
    renWin.AddRenderer(renderer)
    renWin.SetSize(1200, 1200)
    print("Window size:", renWin.GetSize())
    renWin.SetWindowName("ooooooooooooooo")
    # 绘制窗口内所有绘制器同步渲染绘制
    renWin.Render()
    pointPicker = vtk.vtkPointPicker()
    # 交互器
    i_ren = vtk.vtkRenderWindowInteractor()
    i_ren.SetPicker(pointPicker)
    # 交互器绑定绘制窗口
    i_ren.SetRenderWindow(renWin)

    style = vtk.vtkInteractorStyleTrackballCamera()
    i_ren.SetInteractorStyle(style)
    renderer.SetBackground(colors.GetColor3d("Silver"))
    
    renderer.ResetCamera()
    # 交互器初始化
    i_ren.Initialize()
    # 交互器启动
    i_ren.Start()

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值