在这个科技日新月异的时代,图像处理和人脸识别技术已经广泛应用于各个领域。。本文将介绍如何使用C#结合ESP32_Cam来实现图像接收和人脸识别功能。

因为后面的代码无论是逻辑还是细节都有太多太多需要注意的,所以文章内不具体讲解,只做关键部分说明。感兴趣的朋友可以加群拿源码或者来交流。

1.概述

    本项目旨在通过ESP32_Cam模块捕获图像,并使用C#编写的软件进行处理和人脸识别。我们将使用OpenCvSharp库来处理图像,初步实现灰度化、二值化的功能并利用Haar级联分类器进行人脸检测。

2.准备工作

  • 硬件:ESP32_Cam模块。
  • 软件:
  • Visual Studio(用于C#开发)。
  • OpenCvSharp库(用于图像处理)。
  • Haar级联分类器(用于人脸识别)。

3. 界面布局

核心代码解析

监听端口接收图像

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.Mege}");
            }
        }
        // 在UI线程上显示图像的方法
        private void Dispmage(Bitmap image)
        {
            if (InvokeRequired)
            {
                Invoke(new Action(() => DisplayImage(image)));
            }
            else
            {
                pictox.Image = image;
            }
        }

        private void Stten_Click(object sender, EventArgs e)
        {
            if (Staten.Text == "创建监听")
            {
                DisableAll();
                StaeningText();
                PicTurSta.Enabled = false;
                StartListen.Text = "关闭监听";
            }
            else
            {
                EnableAll();
                Stening();
                PicTurSta.Enabled=true;
                StartListen.Text = "创建监听";
            }
        }

图像处理

以下是图像处理的核心代码段:



Bitmap bitmap = new Bitmap(image);
Mat inputMat = OpenCvSharp.Extensions.Bitverter.ToMat(bitmap);
Mat OutMat = new Mat();
OutMat = inputMat.Clone();
// 灰度化
if (HuiDuHua.Checked)
{
    Cv2.CvtColor(inputMat, OutMat, ColonCodes.BGR2GRAY);
}
// 二值化
if (Erzhihua.Checked)
{
    int thresholdValue = Throid.Value;
    Cv2.Threshold(OutMat, OutMat, thresholdValue, 255, ThresholdTypes.Binary);
}


人脸识别

人脸识别部分的代码如下:


string classifierPath = @"rcascade_frontalfac.xml";
CascadeClassifier faceCascade = new Cassifier(classifierPath);
Mat grayImage = new Mat();
Cv2.CvtColor(OutMat, grayImage, ColoonCodes.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;

5. 效果展示


嘉立创PCB

还没有评论,抢个沙发!