目前我正在尝试编写一个小型程序来检测面孔。
我想将用于检测的灰色帧剪切成检测到的面部的矩形大小的片段。
这是我的操作方法:
public List<PreviewImage> GetDetectedSnippets(Capture capture, ProcessType processType)
{
var mat = capture?.QueryFrame();
var imageList = new List<PreviewImage>();
if (mat == null)
return imageList;
var imageframe = mat.ToImage<Bgr, byte>();
var grayframe = imageframe.Convert<Gray, byte>();
Rectangle[] faces = null;
try
{
switch (processType)
{
case ProcessType.Front:
{
faces = _cascadeFrontDefault.DetectMultiScale(grayframe, 1.25, 10, Size.Empty);
}
break;
case ProcessType.Profile:
{
faces = _cascadeProfileFace.DetectMultiScale(grayframe, 1.25, 10, Size.Empty);
}
break;
default:
{
return imageList;
}
}
}
catch (Exception ex)
{
Debug.WriteLine("Could not process snapshot: " + ex);
return imageList;
}
foreach (var face in faces)
{
var detectedImage = imageframe.Clone();
detectedImage.Draw(face, new Bgr(Color.BlueViolet), 4);
var detectedGrayframe = grayframe.GrabCut(face, 1); // This isn't working. Here should the grayframe be cutted into a smaller piece.
imageList.Add(new PreviewImage(detectedImage, detectedGrayframe));
}
return imageList;
}
这是previewImage类:
public class PreviewImage
{
public Image<Bgr, byte> Original { get; }
public Image<Gray, byte> Grayframe { get; }
public PreviewImage(Image<Bgr, byte> original, Image<Gray, byte> grayframe)
{
Original = original;
Grayframe = grayframe;
}
}
如何将灰框切割成具有给定矩形大小的碎片?
答案 0 :(得分:2)
这将完成工作:
grayframe.ROI = face;
var detectedGrayframe = grayframe.Copy();
grayframe.ROI = Rectange.Empty;