音视频视频处理图形学桌面应用【免费下载链接】NatronOpen-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry.项目地址https://gitcode.com/gh_mirrors/na/Natron点击查看免费下载Natron 是一个基于节点图的开源视频合成软件其 Tracker跟踪器节点用于在画面中放置标记点Track并沿时间轴自动跟踪目标。本文以官方开发者文档PythonTutorials/tracker.rst为核心完整讲解如何通过 Python 脚本访问 Tracker 节点、读取每条 Track 的动画数据如中心点关键帧以及如何用代码创建和驱动 Track读完你将能够脱离界面、纯脚本化完成跟踪数据的提取与跟踪任务的启动与停止。一、核心对象模型Tracker 与 TrackNatron 的所有跟踪功能都集中在Tracker类中详见 PythonReference/NatronEngine/Tracker.rst。目前只有 Tracker 节点能够持有一个Tracker对象。该对象由 Natron 在创建节点时自动声明auto-declared可以直接作为节点的属性访问app.Tracker1.trackerTracker对象本身是若干条Track的容器。Track类表示用户能在查看器Viewer上看到的一个跟踪标记点其完整方法说明见 PythonReference/NatronEngine/Track.rst。这种自动声明变量的机制在 Natron 中被广泛使用节点、参数、图层、Bezier 曲线等都适用其背景是与其调用一串函数如app1.getNode(app1.Blur1)不如直接使用一个简单变量如app1.Blur1。相关约定可参考 scriptvslabel.rst。要使用自动声明变量对象必须采用合法的 Python 命名规则script-name 只包含字母数字字符且不以数字开头。通过 script-name 访问 TrackTrack可以通过其 script-name 直接访问app.Tracker1.tracker.track1Track 的 script-name 可以在 Tracker 节点的设置面板settings panel中查看到——将鼠标悬停在列表的 Label 列上工具提示会显示该标记点的 script-name在命令行模式或脚本编辑器中也可以调用Track类的getScriptName()函数获取 script-name对应源码 Engine/PyTracker.cpp内部读取TrackMarker::getScriptName_mt_safe()。提示script-name 与 label 是两个不同的概念——script-name 用于脚本/代码中唯一标识对象创建后不可更改label 是界面上显示的名字可以任意修改。同一 Tracker 中多个 track 的 label 可以重复但 script-name 必须唯一。二、从 Track 中读取跟踪数据在 Natron 内部一条 Track 实际上就是一组参数Param的集合这些参数和普通效果节点的参数一样可以保存动画曲线关键帧数据。每条 Track 内置的数据参数包括参数 script-name 定义于 Engine/TrackMarker.h参数 script-name含义说明centerPoint跟踪中心点二维参数被跟踪目标的位置即“要跟踪的点”offset偏移相对真实跟踪位置施加到中心点的偏移量patternTopLeft/patternTopRight/patternBtmRight/patternBtmLeftPattern 四角定义被跟踪模式Pattern的四边四边形四个角searchWndBtmLeft/searchWndTopRight搜索窗口搜索窗口的左下/右上点相对中心点定义motionModel运动模型跟踪使用的变换模型见下文errorValue误差值每帧跟踪后得到的误差等于 1 减去互相关得分trackWeight权重该标记点对最终求解结果的贡献权重enabled启用开关勾选时该 track 数据才会用于生成最终的 Transform/CornerPin 输出可动画化以控制 track 的生命周期这些参数在 Engine/TrackMarker.cpp 中由AppManager::createKnob...创建并绑定如centerKnob-setName(kTrackerParamCenter)kTrackerParamCenter即字符串centerPoint。两种访问参数的方式既可以按 script-name 直接作为属性访问app.Tracker1.tracker.track1.centerPoint也可以调用getParam(paramScriptName)函数app.Tracker1.tracker.track1.getParam(centerPoint)getParam()的源码实现Engine/PyTracker.cpp会从内部的TrackMarker中按名字查找 Knob并将其包装成 Python 可用的Param对象返回若找不到则返回空。getParams()则返回该 track 的全部参数列表。实战示例提取中心点的全部关键帧下面的示例来自官方教程演示如何取出一条 track 在中心点上的所有X, Y 同时存在的关键帧myTrack app.Tracker1.tracker.track1 keyframes [] # get the number of keys for the X dimension only and try match the Y keyframes nKeys myTrack.centerPoint.getNumKeys(0) for k in range(0,nKeys): # getKeyTime returns a tuple with a boolean value indicating if it succeeded and # the keyframe time gotXKeyTuple myTrack.centerPoint.getKeyTime(k, 0) frame gotXKeyTuple[1] # Only consider keyframes which have an X and Y value # If Y does not have a keyframe at this frame, ignore the keyframe # getKeyIndex returns a value 0 if there is a keyframe yKeyIndex myTrack.centerPoint.getKeyIndex(frame, 1) if yKeyIndex -1: continue # Note that even if the x curve or y curve didnt have a keyframe we # could still call getValueAtTime but the value would be interpolated by # Natron with surrounding keyframes, which is not what we want. x myTrack.centerPoint.getValueAtTime(frame, 0) y myTrack.centerPoint.getValueAtTime(frame, 1) keyframes.append((x,y)) print keyframes代码要点拆解getNumKeys(0)返回 X 维度上的关键帧数量参数是维度号0表示 X、1表示 Y。getKeyTime(k, 0)返回一个元组第一个元素是布尔值表示是否成功第二个元素是关键帧时间。getKeyIndex(frame, 1)查询 Y 曲线上在指定帧是否存在关键帧返回值 0表示存在-1表示不存在。为什么用getKeyIndex做双重校验因为即使 X 或 Y 曲线上没有关键帧也可以调用getValueAtTime取值但这时值会被 Natron 用周围关键帧插值得到这通常不是我们想要的——本示例只收集“X 与 Y 都有真实关键帧”的数据点。跟踪完成后得到的keyframes列表即可用于后续的脚本化处理例如写入导出文件、驱动 CornerPin 或 Transform 节点或作为二次求解如 openMVG 的 PROSAC 鲁棒估计参考 Tests/Tracker_Test.cpp的输入。三、创建 Track 与重置用 createTrack() 新建跟踪点要新建一条 track使用Tracker类提供的createTrack()函数track app.Tracker1.tracker.createTrack()随后就可以像操作 Natron 中其他对象一样对返回的 track 参数设置数值。其底层实现Engine/PyTracker.cpp调用TrackerContext::createMarker()见 Engine/TrackerContext.h创建一个带默认值的TrackMarker并包装成 PythonTrack返回。Tracker类完整的方法一览均可在 Python 中调用方法作用createTrack()在 tracker 中新建一条 track返回Track对象getTrackByName(scriptName)按 script-name 查找并返回对应的Track找不到则返回空getAllTracks()返回该 Tracker 中的所有Track序列getSelectedTracks()返回当前用户在界面中选中的Track序列startTracking(tracks, start, end, forward)对给定 tracks 从start帧跟踪到end帧stopTracking()停止该 Tracker 上任何正在进行的跟踪对应的 C 声明见 Engine/PyTracker.h其中getAllTracks/getSelectedTracks内部遍历TrackerContext的标记列表并逐个包装为TrackEngine/PyTracker.cpp。Track 的脚本管理方法Track类还提供以下方法用于脚本化管理setScriptName(scriptName)设置 track 的 script-name设置后即可通过Tracker1.tracker.MyTrackScriptName这样的形式在脚本中访问。源码见 Engine/PyTracker.cpp。getScriptName()获取 track 的 script-name。getParam(paramScriptName)按 script-name 获取参数。getParams()返回该 track 的所有参数列表。reset()完全重置 track清除所有参数上的动画与 Pattern 上的关键帧底层调用TrackMarker::resetTrack()。用脚本启动与停止跟踪startTracking(tracks, start, end, forward)是对给定 tracks 发起跟踪的核心接口。需要注意的语义与官方文档一致跟踪范围是[start, end)即end帧本身不会被跟踪forward为True时正向跟踪end应大于startforward为False时反向跟踪此时end应小于start。例如从第 1 帧正向跟踪到第 100 帧tracks app.Tracker1.tracker.getAllTracks() app.Tracker1.tracker.startTracking(tracks, 1, 100, True)停止正在进行的跟踪app.Tracker1.tracker.stopTracking()从源码看startTracking会把这些Track解包为内部的TrackMarker列表并交给TrackerContext::trackMarkers(...)Engine/PyTracker.cpp最终由TrackScheduler继承自GenericSchedulerThread见 Engine/TrackerContext.h在后台线程中逐帧调度执行stopTracking则调用TrackerContext::abortTracking()中止任务。跟踪过程中每帧的误差会写入errorValue参数其 hint 注明“误差 1 - 互相关得分”可用于脚本化评估跟踪质量。四、底层实现速览从 Python 到 C 的调用链理解底层调用链有助于排查脚本问题。当你在 Python 中访问app.Tracker1.tracker时实际发生的是Engine/Node.cpp 的declareTrackerPythonField()拼出完全限定名如app.Tracker1执行 Python 语句nodeFullName .tracker nodeFullName .getTrackerContext()把 Tracker 对象绑定为节点属性随后调用TrackerContext::declarePythonFields()把每个 TrackMarker 作为属性如track1声明到tracker对象上这样app.Tracker1.tracker.track1才能直接访问。Tracker/Track的 Python 包装类NATRON_PYTHON_NAMESPACE下的Tracker与Track见 Engine/PyTracker.h内部各持有一个TrackerContextPtr/TrackMarkerPtr智能指针所有 Python 调用最终都落到 Engine 层的TrackerContext与TrackMarker实现上——这也是为什么通过脚本读写参数、启动跟踪与在 GUI 上操作的效果完全一致。五、小结与延伸本文覆盖了 Natron Tracker 节点 Python 脚本化的全部核心能力通过自动声明变量访问Tracker与Track对象使用getParam()/ 属性访问读取centerPoint、offset、Pattern 四角、errorValue等动画参数用getNumKeys/getKeyTime/getKeyIndex/getValueAtTime安全地提取双维度关键帧数据用createTrack()/setScriptName()/reset()管理 track用startTracking(tracks, start, end, forward)与stopTracking()脚本化驱动跟踪任务。更系统的功能讲解可继续阅读 tracker.rst使用 tracker 功能、类参考 Tracker.rst 与 Track.rst若希望了解跟踪求解鲁棒变换估计的算法层细节可进一步研读 TrackerContext.h 与 Tracker_Test.cpp 中的测试用例。赞分享音视频视频处理图形学桌面应用【免费下载链接】NatronOpen-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry.项目地址https://gitcode.com/gh_mirrors/na/Natron点击查看免费下载相关推荐Natron Python API 深入解析使用 Track 类读取与操作 Tracker 节点的跟踪数据Natron Python API 深入解析使用 Track 类读取与操作 Tracker 节点的跟踪数据 导读 本文以 Natron 官方 Python 参音视频视频处理图形学桌面应用Natron 节点图脚本实战用 Python 批量读取 Roto 节点条目标签Natron 节点图脚本实战用 Python 批量读取 Roto 节点条目标签 本篇技术指南围绕 Natron 官方开发文档中的 getRotoItemsLa音视频视频处理图形学桌面应用Natron 的 Tracker Python API 完全指南从轨迹容器到自动化跟踪实战Natron 的 Tracker Python API 完全指南从轨迹容器到自动化跟踪实战 Natron 中的 Tracker 类是为需要跟踪能力的特效节点音视频视频处理图形学桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考