基于C#的软件大杂烩(4.3)——TCP服务端的图像接收和处理
在这个科技日新月异的时代,图像处理和人脸识别技术已经广泛应用于各个领域。。本文将介绍如何使用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


登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!