视频动作标注工具coin_annotation_tool

视频动作标注工具coin_annotation_tool
2019CVPR 美图和清华大学联合教程类行为数据集 COIN,同时提供了一个视频标注工具:
https://github.com/coin-dataset/annotation-tool

使用方法:
下载项目到本地;
在这里插入图片描述

打开coin_annotation_tool.html 文件 (我用Safari浏览器打开有问题,Google浏览器没有问题)
打开网页后如下图:
在这里插入图片描述
准备三个文件video.txt,label.txt,frame.txt
video文件夹里存储的是视频中的每一帧。
video.txt
在这里插入图片描述
label.txt
在这里插入图片描述
frame.txt
在这里插入图片描述

依次从本地加载video.txt,label.txt,frame.txt三个文件,然后点击load。
在这里插入图片描述

打开后进行设置
在这里插入图片描述

右上角有参数可以设置setting,每一行显示的列数,以及显示的帧间隔,最小0.5
在这里插入图片描述
开始标注
不需要对每一帧进行标注,点击start帧和end帧,中间所有的都会被选中,然后对他们进行标注,右边的tags中选择对应的类别

在这里插入图片描述

标注完之后右边会显示标注信息,最后进行保存,生成标注文件。
在这里插入图片描述

<think>我们基于FreeCAD实现选中边显示长度、选中面显示面积的交互功能。FreeCAD提供了强大的PythonAPI,我们可以通过编写宏或自定义工作台来实现。实现思路:1.创建一个自定义工具(例如在工具栏上添加按钮),当激活该工具时,进入测量模式。2.在测量模式下,用户选择边或面时,实时计算并显示几何属性(长度或面积)。3.显示方式:可以在3D视图上直接绘制文本标签,或者在FreeCAD的Python控制台输出,或者弹出一个对话框显示。考虑到简单性,我们首先实现在Python控制台输出选中边的长度和面的面积。然后,再考虑在3D视图中显示文本标签。步骤:1.创建一个新的命令(Command)并添加到工具栏。2.在该命令的激活方法中,设置一个选择观察器(SelectionObserver)来监听用户的选择变化。3.当选择变化时,获取当前选中的对象(边或面),计算其长度或面积。4.将结果输出到控制台,并在3D视图上高亮选中的几何元素。参考引用[1]中,我们可以通过Shape对象获取边和面,并计算它们的几何属性。具体实现:首先,我们需要创建一个自定义的Python命令。以下是一个示例代码框架:注意:我们将代码保存为FreeCAD的宏,或者作为自定义工作台的一部分。代码实现:1.创建命令类,继承于Command。2.在激活命令时,注册一个选择观察器。3.在选择观察器中,当选择改变时,检查选中的几何元素。但是,FreeCAD的选择系统允许我们直接获取当前选中的对象。我们可以通过Gui.Selection.getSelectionEx()来获取选中的对象及其子名称(子元素,如边或面)。计算长度和面积的方法:-对于边:使用Edge.Length属性(单位是mm)-对于面:使用Face.Area属性(单位是mm²)然而,注意:选中的可能是整个对象,也可能是对象的一个子元素(边或面)。我们需要判断选中的是子元素。具体步骤:1.获取当前选择(使用Gui.Selection.getSelectionEx())2.遍历每个选择对象,对于每个对象:-遍历其子元素(SubElementNames)-如果子元素是"Edge"开头的,则通过对象.Shape.getElement(子元素)获取Edge对象,然后计算长度。-如果子元素是"Face"开头的,则获取Face对象,计算面积。3.输出结果。同时,为了在3D视图中显示标签,我们可以使用FreeCADGui中的Annotation类,或者使用Coin3D的SoText2。但为了简单,我们先在控制台输出。我们首先实现一个简单的版本,只输出到控制台。代码示例:创建一个名为MeasureCommand的命令类:```pythonimportFreeCADimportFreeCADGuifrom PySide2importQtWidgetsclass MeasureCommand:"""测量边和面的命令"""defGetResources(self):return{'Pixmap': 'freecad',#可以指定一个图标路径'MenuText':"测量工具",'ToolTip':"测量选中的边或面的长度或面积"}def Activated(self):#激活命令,注册选择观察器self.selection =FreeCADGui.Selection.getSelectionEx()FreeCADGui.Selection.addObserver(self)#添加观察者FreeCAD.Console.PrintMessage("测量模式:选择边或面以测量\n")def Deactivated(self):#命令取消激活时移除观察者FreeCADGui.Selection.removeObserver(self)FreeCAD.Console.PrintMessage("退出测量模式\n")defselectionChanged(self,reason):#当选择改变时被调用#reason:0表示选择增加,1表示选择减少,2表示选择设置if reason==0 orreason ==2:self.processSelection()def processSelection(self):#处理当前选择sel= FreeCADGui.Selection.getSelectionEx()ifnot sel:return#只处理最新选中的元素(我们只取最后一个)last_selection= sel[-1]#获取子元素名称(例如"Edge1","Face2"等)sub_names =last_selection.SubElementNamesif notsub_names:return#获取对象obj= last_selection.Object#遍历子元素for namein sub_names:ifname.startswith('Edge'):#获取边edge= obj.Shape.getElement(name)length =edge.LengthFreeCAD.Console.PrintMessage(f"边 {name}的长度: {length}mm\n")elif name.startswith('Face'):face =obj.Shape.getElement(name)area= face.AreaFreeCAD.Console.PrintMessage(f"面 {name}的面积: {area}mm²\n")#将命令添加到FreeCADFreeCADGui.addCommand('Measure_Command',MeasureCommand()) ```然后,我们可以在FreeCAD的Python控制台中运行以下代码来添加工具栏按钮:```pythontoolbar =FreeCADGui.createToolbar("测量工具")toolbar.addCommand('Measure_Command') ```但是,为了更好的集成,我们可以创建一个自定义工作台。然而,上述代码存在一个问题:当选择多个元素时,我们只处理最后一个选择。我们可以修改为处理所有选中的元素。另外,我们还可以考虑在3D视图中显示标签。这里我们使用一个简单的办法:使用FreeCAD的Annotation标签。但注意,Annotation标签在FreeCAD中通常用于Drawing工作台。我们可以使用Coin3D的SoText2来在3D视图中绘制文本。由于在3D视图中绘制文本需要管理场景图,并且需要实时更新,我们这里先实现控制台输出,后续再扩展3D标签。改进:我们希望在3D视图中高亮选中的边或面,并显示一个临时的文本标签。我们可以这样做:1.创建一个临时对象(比如一个App::FeaturePython)来存储文本标签的位置和内容。2.使用Coin3D的SoGroup来创建一个自定义的节点,包含文本和位置。3.将文本标签添加到视图的根节点下。但是,FreeCAD已经提供了一个ViewProviderAnnotation类,我们可以直接使用。不过,它主要用于2D注释。另一种方法是使用Draft工作台中的文本工具。我们可以创建一个Draft文本对象,并设置其位置。但是这样会创建持久对象。为了简单,我们使用控制台输出,并高亮选中的元素(FreeCAD默认已经高亮)。因此,我们暂时只实现控制台输出。然而,用户可能希望看到更直观的显示。我们可以弹出一个对话框来显示结果,或者使用状态栏。我们修改一下,使用Qt的对话框来显示结果,但这样会打断工作流。所以,我们使用FreeCAD的状态栏(位于底部)来显示最后一次测量的结果。修改代码:在processSelection的最后,将结果输出到状态栏。```python#在状态栏显示最后一个结果iflast_edge_lengthor last_face_area:iflast_edge_length:msg= f"边长度:{last_edge_length} mm"else:msg= f"面面积:{last_face_area}mm²"FreeCADGui.getMainWindow().statusBar().showMessage(msg,3000)#显示3秒```完整代码:```pythonimportFreeCADimportFreeCADGuifrom PySide2import QtWidgetsclassMeasureCommand:"""测量边和面的命令"""def GetResources(self):return {'Pixmap':'freecad',#可以指定一个图标路径'MenuText':"测量工具",'ToolTip': "测量选中的边或面的长度或面积"}def Activated(self):#激活命令,注册选择观察器self.selection =FreeCADGui.Selection.getSelectionEx()FreeCADGui.Selection.addObserver(self)#添加观察者FreeCAD.Console.PrintMessage("测量模式:选择边或面以测量\n")#设置选择模式为只选择边和面FreeCADGui.Selection.addSelectionGate("SELECTPart::FeatureSUBELEMENT Edge,Face")defDeactivated(self):#命令取消激活时移除观察者FreeCADGui.Selection.removeObserver(self)FreeCADGui.Selection.removeSelectionGate()FreeCAD.Console.PrintMessage("退出测量模式\n")defselectionChanged(self,reason):#当选择改变时被调用#reason:0表示选择增加,1表示选择减少,2表示选择设置ifreason ==0or reason==2:self.processSelection()def processSelection(self):#处理当前选择sel= FreeCADGui.Selection.getSelectionEx()ifnot sel:return#初始化最后测量的结果last_edge_length =Nonelast_face_area =None#只处理最新选中的元素(我们只取最后一个)last_selection =sel[-1]#获取子元素名称(例如"Edge1", "Face2"等)sub_names= last_selection.SubElementNamesifnot sub_names:return#获取对象obj =last_selection.Object#遍历子元素forname insub_names:if name.startswith('Edge'):#获取边edge =obj.Shape.getElement(name)last_edge_length= edge.LengthFreeCAD.Console.PrintMessage(f"边{name}的长度:{last_edge_length} mm\n")elifname.startswith('Face'):face= obj.Shape.getElement(name)last_face_area= face.AreaFreeCAD.Console.PrintMessage(f"面 {name}的面积: {last_face_area} mm²\n")#在状态栏显示最后一个结果if last_edge_lengthis notNone orlast_face_areais notNone:iflast_edge_length isnot None:msg =f"边长度: {last_edge_length}mm"else:msg =f"面面积: {last_face_area} mm²"#显示在状态栏,持续3秒FreeCADGui.getMainWindow().statusBar().showMessage(msg,3000) #将命令添加到FreeCADFreeCADGui.addCommand('Measure_Command', MeasureCommand())```注意:我们添加了选择门(SelectionGate)来限制只能选择边和面。这样用户就不会误选其他类型的元素。使用:1.将上述代码保存为FreeCAD的宏(Macro),或者放入FreeCAD的Mod目录下的一个模块中。2.在FreeCAD中,通过Python控制台运行:importMyModule#假设你保存为MyModule.pyMyModule.addCommand()3.或者,在宏菜单中创建工具栏按钮。另外,我们可以创建一个自定义工作台,在Initialize方法中加载这个命令。关于在3D视图中显示标签,我们可以后续扩展。这里先实现基本功能。参考文献:[^1]:FreeCAD二次开发-Shape获得当前文档中任意拓扑对象的点边面长度面积体积等等。[^2]:使用FreeCAD作为主体软件,通过编写插件实现图形解析。[^3]:FreeCAD应用:一道小学平面几何考题。</think># 基于FreeCAD实现几何属性测量功能 我将基于FreeCAD实现选中边显示长度、选中面显示面积的交互功能。参考引用[1]中提到的FreeCAD二次开发能力,我们可以通过Python脚本扩展FreeCAD的功能。 ## 实现方案 ### 核心代码实现 ```python import FreeCAD import FreeCADGui from PySide2 import QtWidgets class GeometryMeasurement: """几何测量工具类""" def __init__(self): self.measurement_mode = False self.setup_ui() def setup_ui(self): """创建测量工具栏""" self.toolbar = QtWidgets.QToolBar("测量工具") FreeCADGui.getMainWindow().addToolBar(self.toolbar) # 测量模式按钮 self.measure_btn = QtWidgets.QPushButton("测量模式") self.measure_btn.setCheckable(True) self.measure_btn.toggled.connect(self.toggle_measurement_mode) self.toolbar.addWidget(self.measure_btn) # 结果显示区域 self.result_label = QtWidgets.QLabel("就绪") self.toolbar.addWidget(self.result_label) # 清除结果按钮 clear_btn = QtWidgets.QPushButton("清除结果") clear_btn.clicked.connect(self.clear_results) self.toolbar.addWidget(clear_btn) def toggle_measurement_mode(self, state): """切换测量模式""" self.measurement_mode = state if state: FreeCAD.Console.PrintMessage("进入测量模式:选择边或面进行测量\n") self.result_label.setText("测量模式:选择边或面") # 注册选择观察器 FreeCADGui.Selection.addObserver(self) else: FreeCAD.Console.PrintMessage("退出测量模式\n") self.result_label.setText("就绪") # 移除选择观察器 FreeCADGui.Selection.removeObserver(self) def clear_results(self): """清除测量结果""" self.result_label.setText("结果已清除") FreeCAD.Console.PrintMessage("测量结果已清除\n") def addSelection(self, doc, obj, sub, pos): """处理选择事件""" if not self.measurement_mode: return # 获取选中的几何元素 selected_object = FreeCADGui.Selection.getSelectionEx()[0] # 判断选择类型 if selected_object.HasSubObjects: sub_element = selected_object.SubObjects[0] # 测量边长度 if sub_element.ShapeType == "Edge": length = self.calculate_edge_length(sub_element) self.display_result(f"边长度: {length:.2f} mm") FreeCAD.Console.PrintMessage(f"边长度: {length:.2f} mm\n") # 测量面面积 elif sub_element.ShapeType == "Face": area = self.calculate_face_area(sub_element) self.display_result(f"面面积: {area:.2f} mm²") FreeCAD.Console.PrintMessage(f"面面积: {area:.2f} mm²\n") def calculate_edge_length(self, edge): """计算边长度""" return edge.Length def calculate_face_area(self, face): """计算面面积""" return face.Area def display_result(self, text): """显示测量结果""" self.result_label.setText(text) # 高亮显示选中的几何元素 FreeCADGui.Selection.clearSelection() FreeCADGui.Selection.addSelection(FreeCAD.ActiveDocument.ActiveObject, FreeCADGui.Selection.getSelectionEx()[0].SubElementNames[0]) # 初始化测量工具 measure_tool = GeometryMeasurement() ``` ### 功能说明 1. **测量模式切换**: - 通过工具栏按钮切换测量模式 - 进入测量模式后,可以选择边或面进行测量[^1] 2. **几何属性计算**: - 边长度计算:`edge.Length` - 面面积计算:`face.Area` - 结果以毫米(mm)和平方毫米(mm²)为单位显示 3. **结果展示**: - 工具栏实时显示测量结果 - FreeCAD控制台输出测量结果 - 选中的几何元素自动高亮显示 4. **交互体验**: - 简洁的工具栏界面 - 状态反馈和结果清除功能 - 测量模式状态指示 ## 使用说明 1. **启动测量功能**: - 在FreeCAD Python控制台中执行上述代码 - 工具栏将出现"测量工具" 2. **进行测量**: - 点击"测量模式"按钮进入测量状态 - 选择模型中的边或面 - 结果将显示在工具栏和Python控制台 3. **清除结果**: - 点击"清除结果"按钮重置显示 ## 数学原理 ### 边长度计算 边长度$L$通过参数曲线积分计算: $$L = \int_{a}^{b} \sqrt{\left(\frac{dx}{dt}\right)^2 + \left(\frac{dy}{dt}\right)^2 + \left(\frac{dz}{dt}\right)^2} dt$$ FreeCAD的`edge.Length`属性直接提供此计算结果[^1]。 ### 面面积计算 面面积$A$通过曲面积分计算: $$A = \iint_{S} dS$$ FreeCAD的`face.Area`属性提供此计算结果[^1]。 ## 高级扩展思路 1. **3D标注显示**: ```python # 在几何元素附近显示测量结果 def create_3d_label(position, text): """创建3D文本标签""" from Draft import makeText label = makeText(text, position) label.ViewObject.FontSize = 5 return label ``` 2. **多元素测量**: ```python def calculate_total_length(edges): """计算多条边的总长度""" return sum(edge.Length for edge in edges) def calculate_total_area(faces): """计算多个面的总面积""" return sum(face.Area for face in faces) ``` 3. **单位转换**: ```python def convert_units(value, from_unit='mm', to_unit='in'): """单位转换""" conversion_factors = { 'mm_to_in': 0.0393701, 'in_to_mm': 25.4 } if from_unit == 'mm' and to_unit == 'in': return value * conversion_factors['mm_to_in'] elif from_unit == 'in' and to_unit == 'mm': return value * conversion_factors['in_to_mm'] return value ``` ## 应用场景 这种测量功能特别适用于: - 模具设计中的尺寸验证 - 机械零件的几何检查 - 3D打印前的模型验证 - 教学中的几何演示[^3] 通过FreeCAD的Python API,我们可以轻松扩展其功能,实现专业级的工程测量工具[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值