fullseye

Fullseye Studio 完全指南

繁重处理不会冻结窗口。底部区域显示当前阶段和进度;停止请求会在下一个阶段边界得到确认。若运行期间设置发生变化,界面会标明显示结果的代次,并可选择查看旧设置的完成结果或用当前设置重新运行。

按处理目的搜索时,候选项会分为适用于当前输入、需要预处理和其他三组。候选项可在不添加处理阶段的情况下试运行一次。运行失败时,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 图像)。


界面构成(3 个面板)

上方是菜单栏(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,右侧面板可伸缩。


左侧面板: Operators 浏览器

示例流水线(SAMPLE PIPELINES)

从下拉菜单中选择 25 个现成配方(recipes.py)之一,流水线就会替换为该配方。例如”Edge — Sobel + Otsu”“Denoise — bilateral + unsharp”“Segment — blob / coin”“Count — blobs”“Texture — Gabor”等。是先跑起来再看内容的便捷起点。

算子浏览器(OPERATORS)

插入位置为”当前选中阶段的下一个位置”。如果没有选中任何阶段,则追加到末尾。


中央面板: 搭建流水线与逐段执行

PIPELINE(阶段列表)

每一行的格式为 N. op (a=…, b=…) -> 结果摘要,执行到该阶段为止的结果状态(image/region/feature 等)显示在右侧。

选中某一阶段后,该阶段为止的中间结果会绘制在右侧 IMAGE 面板,下方的 ANALYSIS(直方图 / Inspector)也会同步更新。这相当于”逐步调试器”。

SELECTED STAGE · KNOBS(旋钮调节)

显示所选阶段的详细信息(op_detail: 名称·in → out sort·分类·HALCON 别名),并通过 2 个滑块 a / b(0.00~1.00) 调节。拖动数值会立即重新计算结果。未选中任何阶段时,滑块会被禁用(不让”无意义的旋钮”处于可用状态的设计)。

旋钮的含义因算子而异(半径 / 阈值 / σ / 方向等)。要调节的是什么,可通过阶段详情标签和工具提示确认。

EXPORT & I/O


右侧面板: 显示·感知·分析

IMAGE(结果视图)

DISPLAY & PERCEPTION (v14)

ANALYSIS


Command palette(Ctrl+P)

按 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    

每个操作无论从菜单、工具栏还是按钮触发,都会调用同一个处理函数(一个动作、多个入口)。


HDevelop 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 重新生成。


多语言支持(en / ja / zh,表驱动)

界面语言可通过 Tools ▸ Language / 言語 / 语言 切换(会被记住)。译文统一存放在 studio_assets/i18n.json 这张表中,无需修改代码即可增加语言:

算子帮助如果存在 op_help/<name>.<lang>.html 就会按语言显示。如实说明: 运行中变化的状态文字(running… / PASS 等)以及算子备注正文目前 不在翻译范围内(算子备注的英文化是与 docstring 双语化配套的未来课题)。

Python 编辑器与 IDE 功能(2026-08-30)

Studio 已经超越了”只能从流水线调用代码”的阶段,也可以作为Python 开发环境使用。

可以拖放打开的文件(2026-10-03)

把文件或文件夹拖放到主窗口,就会在合适的窗口中打开(一次拖放多个文件会打开多个窗口)。完整列表见 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(Tools ▸ 运行台账 op…,Ctrl+Shift+L)(2026-10-03)

用与每个参数类型相符的输入框运行类型化台账中的 op(PIV、数学、驾驶、3-D 等约 1,700 个)的窗口。 在左侧搜索框输入名称或词语,选中 op 后右侧会出现参数表单。

有些 op 用样本跑不起来(这是各 op 样本构造方式的限制;2026-10-03 实测 60 个中 27 个能直接用样本运行)。 窗口本身没有增加失败,由”与把样本直接传给 op 的结果一致”这道门来确认。

将 CSV 列分配给表格操作

类型输入为 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 维以上 以文字给出形状和值域(不把第一个值当作”标量”)

结果缓存、需确认标记与输入图像引用(2026-10-19)

对整个文件夹应用相同的处理

在 Run ▸ 将此处理应用到文件夹… 中,选择输入文件夹和文件模式,先用第一张、中间一张、最后一张或任意一张确认结果,再对全部文件执行。开始执行时会一次性固定输入和处理列,因此中途调整旋钮不会改变正在运行的这一批的条件。

同名文件可在”不覆盖”“覆盖”“加序号”之间选择;若包含子文件夹,输出侧也会建立相同的层级。summary.csv 记录文件名、状态、处理时间、数值输出和错误原因。某一张读取或处理失败时,其余文件继续执行,结束后可在列表中查看失败的文件及原因。停止请求在当前这一张处理完的边界被接受,在真正停止之前不会显示”已停止”。

工作模式与面板

在顶部选择“编排处理”“比较结果”“检查数值”或“生成代码”后,当前工作所需的面板会放大,其余面板会折叠。也可以按 Ctrl+1~4 切换。输入、处理步骤和已计算结果不会改变;每种模式下手动调整的面板布局也会保留。F11 可临时只放大图像,按 Esc 会精确恢复之前的布局。“查找面板…”可按日文名或英文别名找回隐藏的面板。

显示范围与原始数据

“每张图像自动”分别计算范围,“比较图像共用”对 A/B 使用同一范围,“手动”把输入的上下限应用到使用数值范围的显示模式。像 region overlay 这样不使用范围的模式会在标签中说明。“仅用于显示处理”表示原始数值不会改变。NaN 和 Inf 显示为洋红色;超出范围的值使用端点颜色,并显示像素数警告。保存时可选择“原始数值”“当前显示图像”或“两者”,默认保存原始数值。

Export 与 Save/Open 的关系

在 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。


相关文档