c# win app forms检测图像上的人脸数量,如果超过1张人脸提示错误信息
Posted
技术标签:
【中文标题】c# win app forms检测图像上的人脸数量,如果超过1张人脸提示错误信息【英文标题】:c# win app forms detect the number of faces on image and prompt error message if there is more than 1 face 【发布时间】:2021-05-09 10:04:09 【问题描述】:我目前正在使用 C# Windows App Forms 做一个 ID pic 上传系统,我想允许用户上传一张图片,并且图片只能包含 1 个正面。为了防止用户上传超过 1 张人脸,我想在系统检测到图像中的一张以上人脸时提示他们一条错误消息,但我不知道该怎么做。我使用了 takuya takeuchi 的 dlibdotnet 库。
这是我当前的代码。
namespace DetectTrial
public partial class Form1 : Form
#region Fields
private readonly BackgroundWorker _BackgroundWorker;
#endregion
#region Constructors
public Form1()
this.InitializeComponent();
this._BackgroundWorker = new BackgroundWorker();
this._BackgroundWorker.DoWork += this.BackgroundWorkerOnDoWork;
#endregion
#region Methods
#region Event Handlers
private void BackgroundWorkerOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
var path = doWorkEventArgs.Argument as string;
if (string.IsNullOrWhiteSpace(path) || !File.Exists(path))
return;
using (var faceDetector = Dlib.GetFrontalFaceDetector())
using (var ms = new MemoryStream(File.ReadAllBytes(path)))
using (var bitmap = (Bitmap)Image.FromStream(ms))
using (var image = bitmap.ToArray2D<RgbPixel>())
var dets = faceDetector.Operator(image);
foreach (var g in dets)
Dlib.DrawRectangle(image, g, new RgbPixel Green = 255 , thickness: 10);
var result = image.ToBitmap();
this.pictureBox1.Invoke(new Action(() =>
this.pictureBox1.Image?.Dispose();
this.pictureBox1.Image = result;
));
private void button1_Click(object sender, EventArgs e)
using (var opnfd = new OpenFileDialog())
opnfd.Filter = "Image Files (*.jpg;*.jpeg;*.png;)|*.jpg;*.jpeg;*.png";
if (opnfd.ShowDialog(this) == DialogResult.OK)
this._BackgroundWorker.RunWorkerAsync(opnfd.FileName);
#endregion
#endregion
我不知道从这里去哪里。
【问题讨论】:
您告诉我们您正在使用 WinForms(与您的问题无关,因为您没有停留在 UI 代码上),但您实际上并没有告诉我们您使用的是什么库面部检测。任何答案都会涉及到这个神秘库中的代码。 我正在使用 dlibdotnet 库。我是编码新手,所以我不知道该怎么做。 This one? 是的。我的问题是它检测到多个面孔。我需要的是只检测一张脸并在检测到多张脸时提示错误消息,因为它是一个 ID pic 上传系统dets
是检测到的人脸的集合吗?
【参考方案1】:
我不熟悉您正在使用的库,但如果 dets
是检测到的面部矩形的集合,您可能可以使用如下内容:
var dets = faceDetector.Operator(image);
if (dets.Count() > 1)
MessageBox.Show("Too many faces! Why are there so many faces? I can't look. Please make it stop.");
return;
else
var g = dets.First();
Dlib.DrawRectangle(image, g, new RgbPixel Green = 255 , thickness: 10);
var result = image.ToBitmap();
this.pictureBox1.Invoke(new Action(() =>
this.pictureBox1.Image?.Dispose();
this.pictureBox1.Image = result;
));
请注意,Count()
和 First()
是 System.Linq
的扩展方法,因此您需要确保代码文件顶部有一个 using System.Linq;
指令。
另外,Invoke
代码可能更好地移动到 BackgroundWorker 的 OnRunWorkerCompleted
事件(不再需要跨线程调用),您可以直接访问 PictureBox。
【讨论】:
它有效。你很棒!非常感谢你,约翰! x以上是关于c# win app forms检测图像上的人脸数量,如果超过1张人脸提示错误信息的主要内容,如果未能解决你的问题,请参考以下文章