繁重处理不会冻结窗口。底部区域显示当前阶段和进度;停止请求会在下一个阶段边界得到确认。若运行期间设置发生变化,界面会标明显示结果的代次,并可选择查看旧设置的完成结果或用当前设置重新运行。
按处理目的搜索时,候选项会分为适用于当前输入、需要预处理和其他三组。候选项可在不添加处理阶段的情况下试运行一次。运行失败时,Problems 面板会显示原因、位置和下一步操作,可重新选择输入、并排比较、查看详细日志、编辑参数或搜索建议的处理阶段。
日本語 · English · 简体中文 · 繁體中文 · 한국어 · Deutsch · हिन्दी
Fullseye Studio 是一个类似 HDevelop 的可视化流水线工作台。你可以搜索并排列算子,用两个旋钮滑块调节参数,一边缩放/平移查看中间结果一边逐段执行,最终把搭建好的流水线导出为 --ops 字符串 / Python / JSON。它的实体是 fullseye API 的一层薄 GUI 前端,流水线逻辑(PipelineModel)·Inspector(inspect_result)·示例集(recipes)都不依赖 Qt,并且都有独立的单元测试。
本指南是把 studio.py(build_window)与实际代码对照后列出的功能清单。UX/设计的意图在 STUDIO_UX.md,v14 感知面板的背景在 V14.md / PERCEPTION.md。
需要 GUI extras(PySide6)(pip install -e ".[gui]")。
py -3.11 studio.py # 直接从仓库根目录运行
fullseye-studio # 若已 pip install -e .,可用控制台脚本
启动后会打开一个 1320×860 的主窗口(标题: Fullseye Studio)。如果存在 assets/fullseye.ico,会作为窗口/任务栏图标出现。初始状态下已加载合成演示图像(demo_image,包含边缘·斑点·渐变的 256×256 图像)。
上方是菜单栏(File / Edit / View / Run / Help)和品牌工具栏,下方是状态栏(悬停时的坐标+像素值,flash() 的临时消息)。中央为左右分栏的 3 个面板。
| 面板 | 分区(QGroupBox) | 作用 |
|---|---|---|
| 左 | SAMPLE PIPELINES / OPERATORS | 加载示例、浏览算子 |
| 中 | PIPELINE / SELECTED STAGE · KNOBS / EXPORT & I/O | 搭建流水线、调节旋钮、导出 |
| 右 | IMAGE / DISPLAY & PERCEPTION (v14) / ANALYSIS | 结果显示、颜色映射/感知、直方图/Inspector |
初始分栏宽度为 340 / 360 / 640 px,右侧面板可伸缩。
从下拉菜单中选择 25 个现成配方(recipes.py)之一,流水线就会替换为该配方。例如”Edge — Sobel + Otsu”“Denoise — bilateral + unsharp”“Segment — blob / coin”“Count — blobs”“Texture — Gabor”等。是先跑起来再看内容的便捷起点。
name [in_sort → out_sort]。双击插入。悬停会以工具提示显示”名称 / HALCON 别名 / 分类 / sort 转换 / 旋钮 a,b 的说明”。插入位置为”当前选中阶段的下一个位置”。如果没有选中任何阶段,则追加到末尾。
每一行的格式为 N. op (a=…, b=…) -> 结果摘要,执行到该阶段为止的结果状态(image/region/feature 等)显示在右侧。
选中某一阶段后,该阶段为止的中间结果会绘制在右侧 IMAGE 面板,下方的 ANALYSIS(直方图 / Inspector)也会同步更新。这相当于”逐步调试器”。
显示所选阶段的详细信息(op_detail: 名称·in → out sort·分类·HALCON 别名),并通过 2 个滑块 a / b(0.00~1.00) 调节。拖动数值会立即重新计算结果。未选中任何阶段时,滑块会被禁用(不让”无意义的旋钮”处于可用状态的设计)。
旋钮的含义因算子而异(半径 / 阈值 / σ / 方向等)。要调节的是什么,可通过阶段详情标签和工具提示确认。
--ops "…" 字符串和可独立运行的 Python 函数两种形式输出到对话框(便于复制)。{"fullseye_pipeline": 1, "stages": [...]})。这个 JSON 就是 FullseyeEngine.load / imgevolve.py run 的输入。x, y, value(彩色图像则显示 RGB)。gray / shaded relief / height (color) / 各种颜色映射(jet, viridis, turbo, magma, plasma, inferno ……)。QtDataVisualization 时可用/best-effort)。便于查看高度/深度图。optical flow — 用色相可视化两帧之间的稠密光流。motion overlay — 把运动区域叠加到原图上。stereo depth — 从立体视差估计深度并着色。stereo terrain — 立体→点云→地形高度图,并着色。没有帧 B 或尺寸不一致时,会在状态栏显示错误并安全中止。
detect.feature_table)。按 Ctrl+P 会打开一个模糊搜索对话框,可以按名称执行任意操作或任意算子。排序规则是前缀匹配 > 单词前缀匹配 > 部分匹配(palette_filter,不依赖 Qt,已做单元测试)。操作(如 ▸ Open image)排在前面,接着是全部算子(如 op: gaussian),按 Enter 执行。仅用键盘就能完成到算子插入为止的全部操作。
应用内可通过 Help ▸ Keyboard shortcuts(F1) 以表格形式查看全部快捷键(自文档化)。主要的(来自 studio.py 的 act_* 定义):
| 操作 | 快捷键 | 操作 | 快捷键 |
|---|---|---|---|
| Open image | Ctrl+O |
Remove stage | Del |
| Synthetic demo | Ctrl+D |
Move stage up / down | Ctrl+↑ / Ctrl+↓ |
| Save result | Ctrl+S |
Clear pipeline | Ctrl+Shift+Backspace |
| Open pipeline | Ctrl+Shift+O |
Zoom in / out | Ctrl+= / Ctrl+- |
| Save pipeline | Ctrl+Shift+S |
Fit / Actual size (1:1) | Ctrl+0 / Ctrl+1 |
| Export | Ctrl+E |
3D surface | Ctrl+3 |
| Quit | Ctrl+Q |
Reset to start | Home |
| Command palette | Ctrl+P |
Step forward | Ctrl+→ |
| Keyboard shortcuts | F1 |
Run all | Ctrl+Enter |
| Image Viewer | Ctrl+Shift+I |
Run a ledger op | Ctrl+Shift+L |
| Pipeline as code → editor | Ctrl+Shift+E |
每个操作无论从菜单、工具栏还是按钮触发,都会调用同一个处理函数(一个动作、多个入口)。
dev_* 绘图控制指令与 HDevelop 相同,可以从程序中控制绘图行为。在 Program 窗口的脚本中写入 dev_* 行,
它不会被解释为图像阶段,而是作为显示指令,在 Apply 时生效
(docs/HDEVELOP_DEV_OPS.md 中收录了全部 43 个 dev_* 的详尽说明)。
| 指令 | 效果 | 对应 UI |
|---|---|---|
dev_update_window ('off'|'on') |
切换图形窗口的自动更新 | View ▸ Display updates ▸ Graphics window |
dev_update_var ('off'|'on') |
切换变量窗口的自动更新 | 同上 Variable window |
dev_update_pc ('off'|'on') |
切换执行光标的更新 | 同上 Program counter |
dev_update_time ('off'|'on') |
切换逐行处理时间显示 | 同上 Operator timings |
dev_update_off () / dev_update_on () |
一次性将以上全部关闭 / 打开 | 工具栏 Auto-update 开关 |
dev_set_part (Row1, Col1, Row2, Col2) |
设置显示范围(缩放/平移)·负值=整体 | 与鼠标滚轮/Fit 配合使用 |
dev_set_lut ('gray'|'jet'|'viridis'…) |
切换颜色映射(LUT) | View ▸ Display mode |
dev_clear_window () |
清空当前窗口 | — |
set_system ('thread_num', N) |
设置 OpenCV 工作线程数(0=默认/全部) | Tools ▸ System settings |
set_system ('operator_timeout', ms) |
软性算子超时(在 Run status 中警告执行慢的阶段) | 同上 |
dev_set_draw ('fill'|'margin') |
切换 region 叠加层的填充(fill)/ 轮廓(margin) | View ▸ Display mode = region overlay |
dev_set_color ('red'|'green'…) |
region 叠加层的颜色 | 同上 |
dev_set_line_width (N) |
margin 轮廓线宽(px) | 同上 |
dev_disp_text ('label', Row, Col) |
在结果上方添加文字注释(在下一次绘制/dev_clear_window 时消失) |
— |
dev_open_window (Row, Col, W, H) |
打开并放置图形窗口并设为当前(再次 Apply 会重新放置同一个窗口=不会重复增生) | Ctrl+G / Window ▸ Graphics |
dev_set_window (Handle) |
用句柄切换当前窗口 | 点击窗口 |
dev_set_window_extents (Row, Col, W, H) |
当前窗口的位置·大小(-1=保持现状) | 拖动窗口 |
dev_close_window () |
关闭当前窗口(常驻的主窗口受保护) | 窗口的 × |
set_system ('max_graphics_windows', N) |
窗口数量上限(默认 256·所有路径 fail-closed) | Tools ▸ System settings ▸ Windows |
用途: 在开头放置 dev_update_off (),可以在不产生绘图开销的情况下进行大量处理或大量编辑,
之后用 dev_update_on () 一次性刷新到当前状态(与 HDevelop 的性能技巧相同)。更新处于
关闭状态时,状态栏右侧会显示 updates off: …,因此冻结状态不会看起来”像是坏了”。
工具栏的 Auto-update 开关也能实现同样的切换。
注意(如实说明): 与流水线阶段不同,dev_* 不遵循 if/for,会无条件应用
(即使写在分支内部也会触发)。请写在顶层。未支持的 dev_* 会报错。
动手看看: 通过 File ▸ dev_* visualization demo,可以加载并执行一个实际使用 coins 图像 +
上述 dev_* 的 HDevelop 程序(分割→用青色轮廓+标签显示区域)。用于练习的示例图像位于
File ▸ Sample images(共 16 张,来源见 studio_assets/sample_images/manifest.json。
合成图像 = 自制作品/coins·camera 等 = 来自 skimage.data 的 BSD/公有领域素材。可用
tools/gen_sample_images.py 重新生成)。其中 5 张是外观检测(FA)用的场景,不是照片,而是由照明与反射的
物理计算(illumdesign)和 PoC 的成像模型算出:拉丝金属上的划痕、树脂上的压痕与异物纤维、雕刻的批号、
背光下的开孔板、焊缝 X 光图像中的气孔。每张都附有缺陷的真值掩膜(<名称>.truth.png)与 manifest 中的说明,
各自对应一个“FA — …”配方(测试确认它能找出缺陷),可用 tools/gen_fa_samples.py 重新生成。
界面语言可通过 Tools ▸ Language / 言語 / 语言 切换(会被记住)。译文统一存放在
studio_assets/i18n.json 这张表中,无需修改代码即可增加语言:
languages — 语言列表(添加后会自动出现在菜单中。英语始终作为基准)tooltips — 工具提示译文(以英文原文为键)strings — 菜单·按钮·对话框标签的译文(以英文原文为键。2026-08-30
新增。内置日语 40+ 条目,未翻译的字符串保留英文=优雅降级)guide — 快速指南正文(Shift+F2)算子帮助如果存在 op_help/<name>.<lang>.html 就会按语言显示。如实说明:
运行中变化的状态文字(running… / PASS 等)以及算子备注正文目前
不在翻译范围内(算子备注的英文化是与 docstring 双语化配套的未来课题)。
Studio 已经超越了”只能从流水线调用代码”的阶段,也可以作为Python 开发环境使用。
import fullseye 可以直接使用。未保存的缓冲区会以临时副本方式运行,不强制 Save)。
可从 Samples ▾ 在新标签页中打开全部随附的可运行示例(以不带路径的方式打开,
因此不会误覆盖出厂示例)。执行所用的解释器可在 System settings ▸ Editor 中更改。v.mean() / np.percentile(v, 99) /
(v > 0.5).sum()。v=选中的变量,np=numpy,img=输入),每当选择或流水线发生变化时
都会自动重新求值。求值失败的表达式会在该行显示 ⚠(面板不会崩溃)。在变量上
右键 ▸ Inspect in popup… 可立即弹出按类型分类的检查结果+百分位数+数值预览。
已知的限制(如实说明): 由于监视表达式在 GUI 线程中同步求值,非常耗时的表达式
(如对巨大数组做全量扫描)会在此期间阻塞界面。较重的统计计算应简化表达式,
或改在 Python Editor 中执行。把文件或文件夹拖放到主窗口,就会在合适的窗口中打开(一次拖放多个文件会打开多个窗口)。完整列表见 Help ▸ 可打开的文件(拖放)…;那张表由 Studio 实际使用的扩展名常量生成,可能比本节更新。
| 拖放的内容 | 打开方式 | 说明 |
|---|---|---|
| 图像(png / jpg / tif / webp / pgm / pfm / jp2 …)、文件夹 | 图像查看器 | 列表、缩放、像素值、直方图、“用作流水线输入”。文件夹打开其中直接包含的图像 |
.py |
Python 编辑器(每个文件一个标签页) | |
.json |
流水线 | |
| 点云与网格(PLY / STL / PCD / OBJ / OFF / XYZ) | 3-D 查看器 | ASCII 与二进制皆可(PLY 小端与大端,PCD 也支持 binary_compressed) |
3DGS(.ply / .splat) |
3-D 查看器 | 颜色取球谐 DC 项;不透明度 < 0.05 的被隐藏 |
| 医学体数据(NIfTI / NRRD / MHA / DICOM) | 3-D 查看器 | 需要 SimpleITK 等 |
glTF(.glb / .gltf)、LiDAR(.las / .laz) |
3-D 查看器 | 需要 pygltflib / laspy |
| 机器人(MJCF / URDF) | 3-D 查看器 | .xml 仅当根元素为 <mujoco> 或 <robot>。需要 mujoco |
动作捕捉(.bvh)、神经元形态(.swc) |
3-D 查看器 | BVH 关节轨迹按时间着色 |
| 视频、动画 GIF、HDF5 | 视频立方体 | |
| 事件相机 (x, y, t, p)(txt / csv / npy / npz) | 视频立方体 | 按内容识别,转成带极性的帧 |
.npy |
按形状 | 2-D → 输入图像,(N, 3 / 6) → 点云,3-D → 体数据 |
| Markdown、SVG | 文档查看器 | |
| 音频(wav / mp3 / flac / ogg …) | 音频窗口 | 波形、频谱图、播放。WAV 以外需要 soundfile |
机器人模型 + qpos .npy (T, nq) 一起 |
机器人回放 | 滑块与播放按钮 |
用与每个参数类型相符的输入框运行类型化台账中的 op(PIV、数学、驾驶、3-D 等约 1,700 个)的窗口。 在左侧搜索框输入名称或词语,选中 op 后右侧会出现参数表单。
ode_vector_field_grid 生成流场,
再把 piv_quiver 的输入设为”上一次结果”,即得箭头图)。类型不符的输入(把当前图像放进 flow2d 栏)不会运行,而是给出原因。None 即 None,
序列写 1, 2, 3。矩阵或字典样本以 <sample> 标记保存。读不懂的值不会悄悄换回默认值,会说明是哪个参数、为什么。result = …)。fs.ledger. 或 fs. 之后输入会弹出名称候选(随时可按 Ctrl+Space)。
选中台账 op 会插入列出数据参数与必填参数的调用形式,例如 dem_slope(dem, cell_size=),光标停在第一个空位。
在 op 名称上右键或按 Ctrl+Shift+L,即可打开该 op 的运行窗口。ledger: 名称,三步(Ctrl+P → 名称 → Enter)即可打开任意台账 op 的窗口。有些 op 用样本跑不起来(这是各 op 样本构造方式的限制;2026-10-03 实测 60 个中 27 个能直接用样本运行)。 窗口本身没有增加失败,由”与把样本直接传给 op 的结果一致”这道门来确认。
类型输入为 table 时,可在现有台账运行器中选择 CSV 文件…。每个角色只能从实际列名中选择;量具 R&R 使用
part / 零件 ID、operator / 操作者、value / 测量值。检查会显示行数、唯一键、缺失值和重复数。重复数不等时,
会在运行前列出并拒绝相关组,绝不自动修补。映射按操作和表头签名保存,仅相同格式复用。CSV 不会被修改或改名。
| 结果 | 显示方式 |
|---|---|
flow2d (2, h, w) |
色相 = 方向、亮度 = 速度的色轮图上叠加箭头图(最长箭头 = 间距的 0.9 倍) |
| 一维数列 | 折线(MATLAB 的 plot(y)) |
| 表(dict) | 等长的数值列叠成折线;若有 t / x / freq … 列则作横轴 |
(h, w, 4) / (h, w, 1) / 复数 |
合成到白底的 RGB / 灰度 / 绝对值 |z| |
| 空数组、4 维以上 | 以文字给出形状和值域(不把第一个值当作”标量”) |
⟳ calc,取自缓存的段显示 ↺ cache。更换图像、调整顺序或删除某段时,从受影响的段起的缓存会被丢弃。每段只保留最新的一份结果,反复拖动旋钮也不会增长。⚠,原因显示在提示和 Problems 中(与 ✕ 错误是不同的行)。若结果是带有 converged / valid / ok 等字段的表,则照录其申报。没有有效性信息的结果显示为”妥当性未判定”,不会显示 OK。Run all 之后状态栏显示”运行:完成 / 结果:需确认(原因)”或”运行:完成 / 结果:未判定有效性”。Studio 只报告,不会修复 op 的数值问题,也不会改动任何值。input。打开时,文件存在且 sha256 一致则静默重新载入;文件存在但内容已变,则载入并在 Problems 显示 “input file changed since save”;找不到则保留当前图像,并显示 “input not found: 路径”(会尝试 .json 同目录下的同名文件作为重新链接的候选)。没有 input 的旧 JSON 与以前完全一样地读取。true 保存在项目文件中(关闭时不写任何内容,所以不使用旁路的文件与以前逐字节相同);它是缓存键的一部分,因此切换后从该阶段起重新计算。Python 导出只保留 # bypassed: op 注释行,导出的脚本结果与画面一致。在 Program 文本中,旁路阶段是一行 # bypassed: op (a, b),“Apply” 会把它读回来,标记因此得以保留。pinned 中保存阶段、输入、显示和备注(不保存数组),打开时重新计算数组;若无法重新计算,固定仍保留,Problems 中显示 “cannot recompute A”。没有 pinned 的旧文件照常打开。在 Run ▸ 将此处理应用到文件夹… 中,选择输入文件夹和文件模式,先用第一张、中间一张、最后一张或任意一张确认结果,再对全部文件执行。开始执行时会一次性固定输入和处理列,因此中途调整旋钮不会改变正在运行的这一批的条件。
同名文件可在”不覆盖”“覆盖”“加序号”之间选择;若包含子文件夹,输出侧也会建立相同的层级。summary.csv 记录文件名、状态、处理时间、数值输出和错误原因。某一张读取或处理失败时,其余文件继续执行,结束后可在列表中查看失败的文件及原因。停止请求在当前这一张处理完的边界被接受,在真正停止之前不会显示”已停止”。
在顶部选择“编排处理”“比较结果”“检查数值”或“生成代码”后,当前工作所需的面板会放大,其余面板会折叠。也可以按 Ctrl+1~4 切换。输入、处理步骤和已计算结果不会改变;每种模式下手动调整的面板布局也会保留。F11 可临时只放大图像,按 Esc 会精确恢复之前的布局。“查找面板…”可按日文名或英文别名找回隐藏的面板。
“每张图像自动”分别计算范围,“比较图像共用”对 A/B 使用同一范围,“手动”把输入的上下限应用到使用数值范围的显示模式。像 region overlay 这样不使用范围的模式会在标签中说明。“仅用于显示处理”表示原始数值不会改变。NaN 和 Inf 显示为洋红色;超出范围的值使用端点颜色,并显示像素数警告。保存时可选择“原始数值”“当前显示图像”或“两者”,默认保存原始数值。
在 Studio 中搭建的流水线可以用 3 种形式带走。
| 形式 | 导出方式 | 使用场景 |
|---|---|---|
--ops 字符串 |
Export(Ctrl+E) | 贴到 CLI 的 imgevolve.py pipeline --ops "…" / run "…" 中 |
| Python 函数 | Export(Ctrl+E) | 以 fullseye.run_pipeline(...) 的形式嵌入自己的代码 |
| JSON | Save pipeline(Ctrl+Shift+S) | 用 FullseyeEngine.load(...) / imgevolve.py run pipeline.json 执行 |
设计在 Studio 中完成,执行由代码/CLI 负责这种相当于 HDevelop→HDevEngine 的流程,是通过 JSON 完成的。接收 JSON 并执行的一方请参见 ENGINE.md。