需求:根据算法要求,在边缘端相机采集到的图片,需要去掉不需要检测区域,这个区域事先由人先定义。
先生成Mask模板:
public static Mat OpencvMask(List<AlgElementGroupModel> algElementGroupModels, double width, double height)
{
var sTime = DateTime.Now;
var mask = Mat.Zeros(new Size(width, height), MatType.CV_8UC3).ToMat();
var allPoint = new List<List<Point>>();
foreach (var group in algElementGroupModels)
{
foreach (var element in group.ElementData)
{
foreach (var window in element.WindowData)
{
//判断是否是AI算法类型
if (window.AlgType == (int)AlgTypeEnum.AI)
foreach (var recte in window.WindowRectes)
{
allPoint = new List<List<Point>>();
allPoint.Add(new List<Point>
{
new Point(recte.P1.X, recte.P1.Y),
new Point(recte.P2.X, recte.P2.Y),
new Point(recte.P3.X, recte.P3.Y),
new Point(recte.P4.X, recte.P4.Y)
});
Cv2.DrawContours(mask, allPoint, -1, new Scalar(255, 255, 255), -1);
}
}
}
}
Console.WriteLine($"生成Mask模板; 总耗时{(DateTime.Now - sTime).TotalMilliseconds}");
return mask;
}
然后在需要使用的时候,直接与相机图片做AND操作。
public static Mat OpencvMaskCut(Mat sourceMat, Mat maskMat)
{
var sTime = DateTime.Now;
Mat reMask = new Mat();
Cv2.BitwiseAnd(maskMat, sourceMat, reMask);
#region Debug
var savePath = Path.Combine(System.Environment.CurrentDirectory, "ConcatenateImg");
if (!Directory.Exists(savePath))
Directory.CreateDirectory(savePath);
var savePath1 = Path.Combine(savePath, "maskTemplate.jpg");
Cv2.ImWrite(savePath1, reMask);
var savePath2 = Path.Combine(savePath, "maskSource.jpg");
Cv2.ImWrite(savePath2, sourceMat);
#endregion
Console.WriteLine($"Mask模板与新图合成; 总耗时{(DateTime.Now - sTime).TotalMilliseconds}");
return reMask;
}
PS:此操作只需要注意,生成的模板是否与相机图片一样大小。