CNC高级模块的运行后的可视化

This commit is contained in:
zhengxuan.zhang
2026-05-19 13:11:47 +08:00
parent 80c86e2ed7
commit eb6ee48a5e
4 changed files with 147 additions and 1 deletions
@@ -216,6 +216,9 @@ public class BgaVoidRateProcessor : ImageProcessorBase
OutputData["Thickness"] = thickness;
OutputData["ResultText"] = $"Void: {overallVoidRate:F1}% | {classification} | BGA×{bgaResults.Count}";
// 渲染带标注的彩色结果图像
OutputData["RenderedResultImage"] = RenderAnnotatedResult(inputImage, bgaResults, voidLimit, thickness);
roiMask?.Dispose();
return inputImage.Clone();
}
@@ -372,6 +375,67 @@ public class BgaVoidRateProcessor : ImageProcessorBase
mask.Dispose();
voidImg.Dispose();
}
/// <summary>
/// 渲染带标注的彩色结果图像(轮廓、编号、气泡填充、总览信息)
/// </summary>
private Image<Bgr, byte> RenderAnnotatedResult(Image<Gray, byte> grayImage, List<BgaBallInfo> bgaResults, double voidLimit, int thickness)
{
var colorImage = new Image<Bgr, byte>(grayImage.Width, grayImage.Height);
CvInvoke.CvtColor(grayImage, colorImage, ColorConversion.Gray2Bgr);
if (bgaResults.Count == 0)
return colorImage;
// 半透明气泡填充
var overlay = colorImage.Clone();
foreach (var bga in bgaResults)
{
var fillColor = new MCvScalar(0, 200, 255);
foreach (var v in bga.Voids)
{
if (v.ContourPoints.Length > 0)
{
using var vop = new VectorOfPoint(v.ContourPoints);
using var vvop = new VectorOfVectorOfPoint(vop);
CvInvoke.DrawContours(overlay, vvop, 0, fillColor, -1);
}
}
}
CvInvoke.AddWeighted(overlay, 0.4, colorImage, 0.6, 0, colorImage);
overlay.Dispose();
// 绘制焊球轮廓 + 编号
int ngCount = 0;
foreach (var bga in bgaResults)
{
var bgaColor = bga.Classification == "PASS"
? new MCvScalar(0, 255, 0) : new MCvScalar(0, 0, 255);
if (bga.Classification != "PASS") ngCount++;
if (bga.ContourPoints.Length > 0)
{
using var vop = new VectorOfPoint(bga.ContourPoints);
using var vvop = new VectorOfVectorOfPoint(vop);
CvInvoke.DrawContours(colorImage, vvop, 0, bgaColor, thickness);
}
var bbox = CvInvoke.BoundingRectangle(new VectorOfPoint(bga.ContourPoints));
CvInvoke.PutText(colorImage, $"#{bga.Index}",
new Point(bbox.X + bbox.Width / 2 - 10, bbox.Bottom + 16),
FontFace.HersheySimplex, 0.45, new MCvScalar(255, 100, 0), 2);
}
// 左上角总览
int okCount = bgaResults.Count - ngCount;
var overallColor = ngCount > 0 ? new MCvScalar(0, 0, 255) : new MCvScalar(0, 255, 0);
CvInvoke.PutText(colorImage,
$"Total: {bgaResults.Count} | OK: {okCount} | NG: {ngCount}",
new Point(10, 25),
FontFace.HersheySimplex, 0.55, overallColor, 2);
return colorImage;
}
}
/// <summary>