Commit Graph

59 Commits

Author SHA1 Message Date
XplorePlane Developer 539b626117 修复输出控制项目 2026-07-24 18:59:28 +08:00
XplorePlane Developer 2767510385 fix: 恢复 VoidMeasurementProcessor 输出控制项(合并时被 Develop/XP 版本覆盖) 2026-07-24 18:58:54 +08:00
XplorePlane Developer 1dc3f98fcd 合并 Develop/XP(PR 200: 气泡检测算法更新) 2026-07-24 18:53:53 +08:00
XplorePlane Developer 957157ae80 fix: 修复编译错误、BGA向导预览、算子重复插入及状态栏消息
## Compilation fixes
- Fix XAML namespace reference XplorePlane.Converters → XplorePlane.Helpers (EventLogView, StateDisplayView)
- Add missing using for ISampleTypeRepository / JsonSampleTypeRepository in App.xaml.cs
- Fix ILoggerService.Warn() calls using Exception as first arg instead of message string
- Serialize CncProgram to JSON when passing to MatrixLayout (expects string, not CncProgram object)
- Suppress CS8632 nullable annotation warnings project-wide

## BGA wizard fixes
- Fix preview not showing on step 3: force RefreshBgaPreview() when entering final step
- Add step validation in CanNext() to prevent skipping to preview with invalid inputs
- Notify NextCommand.CanExecuteChanged when inputs change
- Fix RunProgress runtime binding error: set Mode=OneWay for ProgressBar.Value

## Operator toolbox: prevent duplicate insertion
- Add static OperatorTarget property for direct dispatch to active pipeline
- PipelineEditorView registers as toolbox target on load (floating window only)
- CNC page sets initial target; PipelineEditorWindow resets to CNC pipeline on close
- '+' button inserts only to the active pipeline instead of broadcasting to all subscribers

## Pipeline editor status bar messages
- Add StatusBarMessageEvent / StatusBarMessagePayload to CommonEvents.cs
- PipelineEditorViewModel publishes status on all ops (add/remove/reorder/save/execute)
- MainViewModel subscribes and displays on main window bottom status bar
- Auto-clear after timeout (3s info, 5s error)

## docs
- Merge three architecture docs into consolidated XplorePlane-架构与结构说明.md
2026-07-24 15:59:16 +08:00
wei.lw.li 1f5b14cfff fix(ImageProcessing): 修复资源泄漏和边界处理问题 2026-07-24 14:30:28 +08:00
wei.lw.li 0e644ba551 fix: QFN空洞检测阈值范围修复 + 多模式支持 2026-07-22 17:09:27 +08:00
wei.lw.li f5c01a036a fix: SubPixelZoomProcessor GaussianBlur 深度不匹配 2026-07-22 16:30:26 +08:00
wei.lw.li d6e7c51bcb feat: 空隙检测新增多模式支持 (Fixed/TopHat/LocalContrast/AdaptiveStatistics) 2026-07-22 16:30:18 +08:00
zhengxuan.zhang 8b1d20bd34 高级算子模块 输出参数的控制 2026-07-22 15:40:20 +08:00
wei.lw.li 8f611db0a8 feat: BGA检测新增AdaptiveStatistics模式 + 算法修复 2026-07-22 14:30:07 +08:00
wei.lw.li 9b0948cea9 feat(bga): 简化检测模式为Fixed/TopHat/LocalContrast,优化气泡形状过滤,恢复LocalContrastAbsMin参数 2026-07-21 17:49:51 +08:00
wei.lw.li 5d7f717e6a feat(bga): 新增拟合椭圆裁剪去除宽基凸起并改进毛刺径向法
- BgaVoidRateProcessor 新增 BgaEllipseClipScale 参数,用拟合椭圆掩码裁剪焊球轮廓,切除形态学与径向法都无力的宽基凸起
- 毛刺径向法基准由形心/全局中位数半径改为椭圆中心/椭圆极径 r(θ),基准不受宽凸起牵引且兼容椭圆形焊球
- 移除低效且与面积一致性过滤重叠的 BgaMinCenterDistance 距离过滤参数
- 同步更新 BgaDetectionViewModel 参数下发、面板 XAML 控件与文件头说明
2026-07-21 16:02:31 +08:00
wei.lw.li 78694642bd Revert "feat: 深度优化BGA焊点和气泡检测算法"
This reverts commit 2da914179c.
2026-07-21 13:48:39 +08:00
wei.lw.li 2da914179c feat: 深度优化BGA焊点和气泡检测算法
焊点检测:新增距离变换+分水岭自动分离粘连焊球(BgaUseDistanceSplit);形态学核改为7x7;迭代次数可调(BgaMorphIterations);开运算加强分离能力

气泡检测:新增局部背景减除增强气泡对比度(VoidContrastEnhance);自适应阈值改为中值+偏移量模式(比百分位更稳健);气泡检测后增加形态学开运算去噪

默认参数:圆度0.6、自适应阈值开启、对比度增强开启、偏移量8000
2026-07-21 13:42:43 +08:00
wei.lw.li 38471bf510 feat: 改进BGA焊点和气泡检测算法,提升复杂背景下的检测精度
- 焊点检测:增加开运算去噪、闭运算改为1次减少粘连、提高默认圆度阈值0.6

- 新增焊球最小中心距过滤和面积一致性过滤,去除粘连和背景误检

- 气泡检测:新增自适应阈值,基于焊球内部灰度分布自动计算阈值

- BGA检测面板增加新参数控件:自适应阈值开关、阈值百分位、中心距、面积一致性
2026-07-21 13:31:51 +08:00
wei.lw.li b1484ad2c6 fix:Normalize=false 时用 FromFloatImageClamped 保持除法后的绝对像素值语义 2026-07-21 10:16:43 +08:00
wei.lw.li 4f9d842898 fix:Normalize=false 时改用 FromFloatImageClamped(按绝对差值截断),true 时仍 min-max 拉伸 2026-07-21 10:15:58 +08:00
wei.lw.li f30d3c39fb fix:修复前所有类型都匹配不上、输出恒为全黑,现在三种带通滤波都能正常工作 2026-07-21 10:15:11 +08:00
wei.lw.li 42c1369604 refactor(processors): 伪彩色算子泛型化并修正形态学算子注释
- PseudoColorProcessor: 改为泛型,灰度主图按原位深透传避免降位;彩色叠加图仍为8位(显示固有限制)
- MorphologyProcessor: 修正误导性注释,OpenCV形态学运算原生支持CV_16U,实际无降位
2026-07-21 10:06:03 +08:00
wei.lw.li 85045d45e2 fix(processors): 修复对比度与阈值算子16位分支的降位精度损失
- ContrastProcessor: CLAHE分支改用原生CvInvoke.CLAHE(支持CV_16U),不再16→8→16往返
- ThresholdProcessor: Otsu分支在16位完整直方图(65536 bin)上原生计算最优阈值
2026-07-21 10:05:13 +08:00
wei.lw.li 87cd56b87e refactor(processors): 图像增强算子改造为原生16位泛型实现
消除8位适配器16→8→16往返的精度损失,全程float域运算:
- HDREnhancementProcessor: 4种色调映射按位深归一化,保留暗部/亮部细节
- RetinexProcessor: SSR/MSR/MSRCR对数域运算保精度
- HierarchicalEnhancementProcessor: 多尺度高斯分解改在float域进行
- ColorLayerProcessor: 分层阈值与直方图按完整位深(16位65536 bin)计算
- EmbossProcessor: 浮雕卷积float域,灰度偏移按位深缩放
2026-07-21 10:04:13 +08:00
wei.lw.li 00c3c80481 feat(processors): 直方图均衡化算子改造为原生16位泛型实现
- 类改为 HistogramEqualizationProcessor<TDepth> 泛型,自动被发现机制识别为原生16位算子
- 全局均衡化16位模式:在65536 bin上直接做CDF映射,消除8位往返导致的梳状间隔放大
- CLAHE模式:改用OpenCV原生CvInvoke.CLAHE,原生支持CV_16UC1,无需降位
- 8位行为保持不变,算子键名兼容旧recipe
2026-07-21 09:28:10 +08:00
wei.lw.li 34f3eb78ce fix: 修复图像处理算子内存泄漏和健壮性问题
ContrastProcessor: 修复AutoContrastStretch中floatImage重新赋值导致的内存泄漏, 修复线性模式brightness调整时result+覆盖中间图像泄漏

MorphologyProcessor: switch添加default分支防止未处理的结构元素类型

MultiplicationProcessor/BilateralFilterProcessor/PixelDepthHelper: 相关16位处理优化
2026-07-20 15:45:33 +08:00
wei.lw.li 90bff74caf fix: 修复16位TIFF图像加载时精度丢失导致的色带问题
根本原因:WPF的BitmapImage加载16位灰度TIFF时自动转换为Bgr32(8位)格式,
导致原始16位精度(8976个灰度级)被压缩为约35个灰度级,产生明显色带。

修复内容:
- MainViewModel.ExecuteLoadImage: TIFF文件改用TiffBitmapDecoder+PreservePixelFormat加载
- PipelineEditorViewModel.LoadImageFromFile: 同样修复TIFF加载方式
- XP.Common.Converters.ImageConverter: ConvertGray16ToBitmapSource直接输出Gray16格式
- ImageConverter.ToBitmapSourceAutoNormalize: 采用ImageJ风格的线性映射显示算法
2026-07-20 11:49:42 +08:00
wei.lw.li 52d7379b23 feat:空隙检测增加排除检测区域 2026-07-13 13:34:31 +08:00
zhengxuan.zhang 5c6c608d13 feat(cnc): CNC 运行时 BGA/QFN 结果复核弹窗
在 CNC 运行到含统计项的检测模块时,弹出结果复核窗供操作员查看明细、
改判合格/不合格/警告并填写备注;判定与备注复用标记 mark 机制归档,
点击"继续"恢复执行、"中止"停止运行。

主要变动:
- 处理器门控:BgaVoidRate / QfnLeadPadVoid / QfnAutoDetection 三个算子
  新增"运行时弹出结果"(ShowResultDialog) 参数并写入 OutputData,
  由编排者在流水线中按需开关。
- 复核弹窗:新增 InspectionReviewWindow / InspectionReviewViewModel,
  按 InspectionResultTable.Columns 通用列驱动动态建表(多表用 TabControl),
  不合格/缺失行标红,展示数量/不合格/缺失汇总与 PASS/FAILED 判定横幅。
- 执行接线:CncExecutionService 在检测模块跑完流水线、归档前,
  若开启弹窗且存在明细表则调用复核交互;操作员中止时抛
  OperationCanceledException 停止运行。
- 交互与落库:ICncInteractionService/CncInteractionService 新增
  ShowInspectionReviewAsync(Dispatcher 模态、无 UI 环境降级不阻塞);
  InspectionMapViewModel 新增 InsertCncResultMarkAsync,复用
  AddMarkAsync/UpdateMark 将判定+备注落成标记。
- 契约:新增 InspectionReviewRequest / InspectionReviewOutcome。
- 测试:新增 InspectionReviewViewModel 汇总计算单测。
2026-07-06 09:46:38 +08:00
zhengxuan.zhang 9a10482d8e 直方图控件填充为蓝色;修复CNC属性面板内控件显示不全的问题 2026-07-02 10:12:11 +08:00
zhengxuan.zhang 053da2a8a3 新增区域截图功能 2026-06-30 16:00:12 +08:00
zhengxuan.zhang ab30e435bc 优化直方图控件,增加显示位置的属性; 修复算子工具箱发现逻辑;
1. ImageProcessorBase.cs — 新增 GetParametersDictionary() 公开方法,让适配器可以共享内部算子的参数字典引用。

2. ImageProcessingService.cs — 新增 ByteToUshortProcessorAdapter 类和发现逻辑:

适配器 (ByteToUshortProcessorAdapter): 包装一个 byte 算子为 ushort 接口。处理流程是 16 位输入 → 右移 8 位降到 byte → 委托给内部 byte 算子 → 结果 ×257 升回 ushort。参数字典和 OutputData 直接共享引用,外部 SetParameter 直接生效。
发现逻辑:DiscoverProcessors 现在分两遍扫描:
第一遍:原有逻辑,找原生 ushort 和泛型算子
第二遍:找 byte-only 算子(继承 ImageProcessorBase<byte> 且不可赋值给 ImageProcessorBase<ushort>),用适配器包装后注册。如果 key 已被第一遍注册则跳过(泛型版本优先)
2026-06-30 11:11:50 +08:00
zhengxuan.zhang 24303e1cf7 Merge branch 'Feature/16-bitImageProcessing' into Feature/TURBO-002-Cnc
# Conflicts:
#	XP.Hardware.PLC.Sentry/XP.Hardware.PLC.Sentry.csproj
#	XplorePlane.sln
2026-06-29 17:05:38 +08:00
李伟 680f61e711 feat(算子层): BGA/Void/QFN/模板匹配统一改为 ImageProcessorBase<ushort>
- BgaVoidRateProcessor: 改为 ushort 输入,16位双阈值分割后转8位二值图给FindContours
- VoidMeasurementProcessor: 同上,删除旧的 VoidMeasurementProcessor16 包装类
- QfnLeadPadVoidProcessor: 同上
- RotatedTemplateMatchingProcessor: 改为 ushort 输入,内部 ToByteImage 降位后传给C++库
- QfnAutoDetectionProcessor: 内部调用处增加 8→16 升位适配
- 所有阈值参数范围统一为 0-65535
2026-06-17 16:02:13 +08:00
李伟 ecc58a5819 feat(算子库): 50个算子升级为泛型,同时支持 8位/16位灰度图像处理
泛型算子(ImageProcessorBase<TDepth>,byte/ushort 均支持):
- 滤波处理:GaussianBlur、MeanFilter、MedianFilter、BilateralFilter
             HighPassFilter、LowPassFilter、BandPassFilter、ShockFilter
- 边缘检测:SobelEdge、KirschEdge、HorizontalEdge
- 图像变换:Grayscale、Mirror、Rotate、Threshold
- 图像增强:Contrast、Gamma(LUT 升级为 ushort[65536])、Sharpen、SubPixelZoom
- 数学运算:Difference、Multiplication、Division、Integral、Or
- 其他:FilmEffect(窗宽窗位参数扩展至 0-65535)、MorphologyProcessor
- 检测分析:EdgeLineFit、EdgeCircleFit(卡尺剖面读取支持 16 位灰度)

保持 8位专用(ImageProcessorBase<byte>):
- 轮廓/椭圆检测、BGA/QFN/Void 检测、模板匹配等需要 FindContours/CV_8U 的算子

新增:
- VoidMeasurementProcessor16:16位专用包装类,阈值参数范围 0-65535
- VoidMeasurementProcessor/BgaVoidRateProcessor 阈值参数范围扩至 65535
2026-06-16 13:00:15 +08:00
李伟 6d27a02a9b feat(算子库): ImageProcessorBase 升级为泛型基类,支持 byte/ushort 双位深
- ImageProcessorBase<TDepth> 泛型基类,where TDepth : struct, IComparable
- 保留 ImageProcessorBase 别名(= ImageProcessorBase<byte>)完全向后兼容
- 新增 PixelDepthHelper 工具类,封装 byte/ushort 转换、像素读写、阈值缩放等通用操作
- MaxPixelValue 属性动态返回位深最大值(byte=255,ushort=65535)
2026-06-16 11:48:19 +08:00
李伟 841cf34890 合并 XP.ImageProcessing.Core 到 XP.ImageProcessing.Processors/Core 2026-06-09 16:11:06 +08:00
zhengxuan.zhang 7683596c17 编译策略: “入口程序、硬件与 Native 依赖项目固定 x64,纯托管类库保持 Any CPU”的平台策略 2026-06-05 21:33:56 +08:00
李伟 7643cd77da 更新强度匹配类名与形状匹配对应 2026-06-03 16:02:44 +08:00
李伟 e7b660ecfb 将 C# 强度匹配封装重命名为 IntensityMatcherHandle,与 C++ IntensityMatcher 命名对齐 2026-06-03 13:15:53 +08:00
李伟 5cd1501de9 支持基于形状的模板匹配模式(独立于强度匹配)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 11:31:46 +08:00
李伟 5b4ff89ef0 新增 QFN 一体检测算子,串联模板匹配与双路空洞检测。
将模板定位、中心 ROI 对齐、中心焊盘空洞和引脚空洞检测整合到单算子中,并输出统一判定结果,便于快速验证完整流程。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 17:06:48 +08:00
李伟 1874c4a5bb 新增 ROI 对齐基础能力并打通到算子与 UI。
统一补齐对齐核心工具类、RoiAlignment 算子、模板匹配对齐扩展和多语言资源,便于在检测前稳定完成示教 ROI 到运行图的变换。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 17:04:32 +08:00
李伟 030433cc92 优化:修复Logger类型错误,重写CLAHE算法,像素遍历改用unsafe指针加速 2026-05-26 13:28:52 +08:00
李伟 0f24209e13 新增QFN引脚空洞率检测处理器及本地化资源 2026-05-26 11:22:04 +08:00
李伟 e233f0fd96 feat: 新增边缘查找拟合圆工具 + 优化拟合交互
- 新增 EdgeCircleFitProcessor 算子(卡尺径向边缘检测 + Kasa/RANSAC圆拟合)
- 新增 EdgeCircleFitPanel 辅助面板(拖拽画圆交互)
- Ribbon快捷工具组新增「圆拟合」按钮
- 拟合后卡尺保持可编辑状态,支持调整后重新拟合
- 每次拟合自动清除上一次结果
- 拟合方法固定RANSAC,UI不暴露选择
- 结果标注简化:直线显示角度,圆显示半径和圆心坐标
- 不再显示内点/外点小圆点
- 添加中英文本地化资源
2026-05-18 15:03:34 +08:00
李伟 12938764b1 feat: 新增边缘查找拟合直线工具
- 新增 EdgeLineFitProcessor 算子(卡尺边缘检测 + 最小二乘/RANSAC直线拟合)
- 新增 EdgeLineFitPanel 辅助面板(参数配置、交互绘制卡尺)
- 支持任意角度旋转的卡尺区域,4个手柄控制长度/宽度
- 支持多次拟合累积显示,关闭面板后结果保留
- 极性箭头标识搜索方向(B→D / D→B / 双向)
- 卡尺亮绿色1px,拟合直线蓝色2px
- Ribbon快捷工具组新增「直线拟合」按钮
- 添加中英文本地化资源
2026-05-15 15:44:18 +08:00
李伟 7447463c1a feat: ROI 对齐工具与 TM_Result 位姿扩展
- Core: Pose2D、Point2D、RoiAlignment、AlignmentRecipe(示教多边形→运行图刚体变换)

- Processors: TemplateMatchAlignmentExtensions.ToPose2D / 四角与中心一致性校验

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-15 14:31:48 +08:00
李伟 e0eec42a2f feat: 模板匹配助手窗口与主视口 ROI 清除逻辑
- 新增模板助手/批量测试窗口、事件与 ViewModel,主窗口入口与 App 注册

- 运行匹配或批量测试前发布清除事件;视口通过 VisualTreeHelper 从父 Panel 移除持久虚线 ROI,避免 FindChild 失败时框残留

- TemplateMatchNative 等相关调整

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-15 10:42:20 +08:00
李伟 82465e6510 白底/黑底检测:轮廓与最远弦度量,UI 分色与标注优化
- 算子:输出轮廓顶点及顶点间最远弦(微米标定与原先一致)

- 视图:实线轮廓;白底红/黑底绿;尺寸文字置于 ROI 外右侧垂直居中

- 事件与 MainViewModel 载荷改为 BackgroundDefectDetectionItem

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-15 09:08:44 +08:00
李伟 baef619bd4 refactor: 白底/黑底检测算法迁至 BackgroundDefectAnalyzer
- 在 XP.ImageProcessing.Processors 新增静态分析类与 BackgroundDefectMode/BackgroundDefectBlob。

- MainViewModel 仅负责灰度 ROI 提取、坐标平移与 Prism 事件发布。
2026-05-14 16:27:16 +08:00
李伟 aedbef5ecc 删除简单的opencv模板匹配算子,改为使用更高级一点的可旋转匹配算子(C++) 2026-05-13 14:04:10 +08:00
李伟 b9106acdf0 快捷工具处添加比例尺开关 2026-05-13 09:05:05 +08:00