在这个科技日新月异的时代,图像处理和人脸识别技术已经广泛应用于各个领域。 前面有篇公众号中提出 了 使用Python实现图像的接收
。 本文将介绍如何使用C#结合ESP32_Cam来实现图像接收和人脸识别功能。 本期以及往期的源码都会分享到QQ交流群 :656210280.
…..感兴趣的小伙伴可以加群探讨一下。
因为后面的代码无论是逻辑还是细节都有太多太多需要注意的,所以文章内不具体讲解,只做关键部分说明。感兴趣的朋友可以加群拿源码或者来交流。
1.概述
本项目旨在通过ESP32_Cam模块捕获图像,并使用C#编写的软件进行处理和人脸识别。我们将使用OpenCvSharp库来处理图像,初步实现灰度化、二值化的功能并利用Haar级联分类器进行人脸检测。
2.准备工作
-
硬件 :ESP32_Cam模块。
-
软件 :
-
Visual Studio(用于C#开发)。
-
OpenCvSharp库(用于图像处理)。
-
Haar级联分类器(用于人脸识别)。
-
3. 界面布局
4.核心代码解析
监听端口接收图像
private void StopListening() { // 停止TCP监听 isListening = false; if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); cancellationTokenSource.Dispose(); cancellationTokenSource = null; }
if (tcpListener != null) { tcpListener.Stop(); } }
private void ListenForText(CancellationToken cancellationToken) { try { while (!cancellationToken.IsCancellationRequested) { using (TcpClient tcpClient = tcpListener.AcceptTcpClient()) { using (NetworkStream networkStream = tcpClient.GetStream()) { using (MemoryStream memoryStream = new MemoryStream()) { byte[] buffer = new byte[4096]; int bytesRead;
while ((bytesRead = networkStream.Read(buffer, 0, buffer.Length)) > 0) { memoryStream.Write(buffer, 0, bytesRead); }
// 处理和显示接收到的数据 string receivedText = Encoding.UTF8.GetString(memoryStream.ToArray()); ReciveText.AppendText(receivedText);
} }
// 关闭TcpClient tcpClient.Close(); } } } catch (Exception ex) {
Console.WriteLine($"错误:{ex.Message}"); } } // 在UI线程上显示图像的方法 private void DisplayImage(Bitmap image) { if (InvokeRequired) { Invoke(new Action(() => DisplayImage(image))); } else { pictureBox.Image = image; } }
private void StartListen_Click(object sender, EventArgs e) { if (StartListen.Text == "创建监听") { DisableAll(); StartListeningText(); PicTurSta.Enabled = false; StartListen.Text = "关闭监听"; } else { EnableAll(); StopListening(); PicTurSta.Enabled=true; StartListen.Text = "创建监听"; } }
** 图像处理 **
以下是图像处理的核心代码段:
Bitmap bitmap = new Bitmap(image);Mat inputMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);Mat OutMat = new Mat();OutMat = inputMat.Clone();// 灰度化if (HuiDuHua.Checked){ Cv2.CvtColor(inputMat, OutMat, ColorConversionCodes.BGR2GRAY);}// 二值化if (Erzhihua.Checked){ int thresholdValue = Throid.Value; Cv2.Threshold(OutMat, OutMat, thresholdValue, 255, ThresholdTypes.Binary);}
** 人脸识别 **
人脸识别部分的代码如下:
string classifierPath = @"[文件路径]haarcascade_frontalface_default.xml";CascadeClassifier faceCascade = new CascadeClassifier(classifierPath);Mat grayImage = new Mat();Cv2.CvtColor(OutMat, grayImage, ColorConversionCodes.BGR2GRAY);Rect[] faces = faceCascade.DetectMultiScale(grayImage);foreach (Rect face in faces){ Cv2.Rectangle(OutMat, face, Scalar.Red, 2);}
注意点
我们使用NuGet管理包来安装我们需要的OpenCV的包,需要注意的是,这四个包都是需要的,并且我们需要在代码开始的时候导入我们的库。
using OpenCvSharp;using OpenCvSharp.Extensions;