在Visual Studio上,使用OpenCV实现人脸识别

1. 环境与说明

本文介绍了如何在Visual Studio上,使用OpenCV来实现人脸识别的功能

环境说明 :

  • 操作系统 : windows 10 64位
  • Visual Studio版本 : Visual Studio Community 2022 (社区版)
  • OpenCV版本 : OpenCV-4.8.0 (2023年7月最新版)

实现效果如图所示,识别到的人脸会用红框框出来 :

在这里插入图片描述

2. 配置Visual Studio环境

这部分详见我的另一篇博客 : Visual Studio 2022 cmake配置opencv开发环境

最终配置好后,能够在Visual Studio中正常调用OpenCV,运行CMake项目(C++程序)
在这里插入图片描述

3. 实现摄像头预览

这部分要用到VideoCapture这个类,VideoCapture既支持从视频文件读取,也支持直接从摄像机等监控器中读取,还可以读取 IP 视频流,要想获取视频需要先创建一个 VideoCapture 对象来打开相机,然后就可以来操作视频帧了。

我们将项目代码修改为如下内容

#include "OpenCVTest.h"
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{VideoCapture capture;//打开相机,这个传入的相机ID为0capture.open(0);if (!capture.isOpened()){cout << "opencv打开摄像头失败!\n" << endl;return -1;}//Mat矩阵,用来存一张图片Mat frame;while (true){//从capture中取数据,将画面输出到frame矩阵里面capture >> frame; if (frame.empty()){cout << "读取摄像头数据失败\n" << endl;}imshow("摄像头", frame); //显示图像if (waitKey(30) == 27) //按下ESC键退出程序{break;}}return 0;
}

运行程序,效果如下所示

在这里插入图片描述

4. 转化为灰度图像

接下来我们需要将图片转化为灰度图,为什么要进行灰度化处理呢 ? 主要有以下几个作用,提高人脸识别的准确性和可靠性

  • 简化图像处理:灰度化可以将彩色图像转化为黑白图像,使得处理更加简单。彩色图像包含三个通道(红、绿、蓝),而灰度图像只有一个通道,使得处理更加快速和高效。
  • 消除颜色信息:人脸识别对于颜色信息并不是非常敏感,而更关注形状和轮廓等特征。因此,通过灰度化处理,可以消除颜色信息对于后续处理的影响。
  • 提高处理性能:灰度化处理可以减少计算量,提高处理性能。在人脸识别过程中,对每个像素进行颜色计算会消耗大量计算资源,而灰度化处理只需要对每个像素的亮度进行计算,减少了计算量。
  • 突出图像特征:灰度化处理可以突出图像中的边缘和纹理等特征。这些特征对于人脸识别非常关键,可以帮助算法更好地识别人脸。

进行灰度化处理我们需要调用void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );,这里src是我们输入的图像,dst是我们要输出的图像,code需要传COLOR_BGR2GRAY,表示将BGR转化为灰度图。

要注意,在OpenCV中,是BGR排列方式,而不是RGB排列。

具体完整代码如下

#include "OpenCVTest.h"
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{VideoCapture capture;capture.open(0);if (!capture.isOpened()){cout << "opencv打开摄像头失败!\n" << endl;return -1;}Mat frame; //摄像头彩色图像Mat grayFrame; //摄像头灰度图像while (true){//从capture中取数据,将画面输出到frame矩阵里面capture >> frame; if (frame.empty()){cout << "读取摄像头数据失败!\n" << endl;return -1;}imshow("摄像头", frame); //显示彩色图像//灰度化处理cvtColor(frame, grayFrame, COLOR_BGR2GRAY); //注意 : OpenCV中是BRGimshow("灰度化", grayFrame); //显示灰色图像if (waitKey(30) == 27) //ESC键{break;}}return 0;
}

运行程序,效果如下所示,左边的是彩色画面,右边的是黑白画面

在这里插入图片描述

5. 直方图均衡化处理

接着,要进行直方图均衡化处理,为什么要进行这一步操作呢 ? 主要有以下几个作用,提高人脸识别的准确性和可靠性

  • 提高对比度:直方图均衡化通过重新分布图像像素的灰度级,将原始图像中的灰度级分布变得更加均匀。这样做可以增强图像的对比度,使得人脸的特征更加清晰可见。
  • 消除光照变化:人脸识别中的一个挑战是光照变化对人脸图像的影响。直方图均衡化可以消除光照变化,使得人脸图像在不同光照条件下具有一致的亮度和对比度。
  • 提高图像质量:直方图均衡化可以改善图像的质量,去除图像中的噪声和伪影。这对于后续的人脸特征提取和匹配非常重要,可以提高人脸识别的准确性和鲁棒性。
  • 增强细节信息:直方图均衡化可以增强图像的细节信息,使得人脸图像中的纹理和特征更加明显。这对于人脸识别算法的性能至关重要,可以提高人脸识别的准确率和鲁棒性。

直方图均衡化处理需要调用void equalizeHist( InputArray src, OutputArray dst);src是输入的图像,需要是单通道的灰度图,dst是我们输出的图像。

具体完整代码如下

#include "OpenCVTest.h"
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{VideoCapture capture;capture.open(0);if (!capture.isOpened()){cout << "opencv打开摄像头失败!\n" << endl;return -1;}Mat frame; //摄像头彩色图像Mat grayFrame; //摄像头灰度图像Mat equalizeFrame; //直方图while (true){capture >> frame; //从capture中取数据,将画面输出到frame矩阵里面if (frame.empty()){cout << "读取摄像头数据失败!\n" << endl;return -1;}imshow("摄像头", frame); //显示图像//灰度化处理cvtColor(frame, grayFrame, COLOR_BGR2GRAY); //注意 : OpenCV中是BRGimshow("灰度化", grayFrame); //显示图像//直方图均衡化,用来增强图像对比度,从而让轮廓更加明显equalizeHist(grayFrame, equalizeFrame);imshow("直方图", equalizeFrame);if (waitKey(30) == 27) //ESC键{break;}}return 0;
}

运行程序,效果如下所示,最右边的是经过直方图均衡化处理后的
在这里插入图片描述

6. 加载级联分类器

级联分类器CascadeClassifier的作用是进行目标检测。它是一种基于机器学习的分类器,通过训练多个弱分类器来识别目标物体。这些弱分类器层层级联,形成一个级联分类器,能够快速准确地检测出图像中的目标物体。

级联分类器通常用于人脸检测,可以通过训练来识别人的面部特征,如眼睛、鼻子、嘴巴等,从而识别人脸并定位人脸的位置。在OpenCV中,CascadeClassifier类提供了一个方便的接口,可以加载预训练的级联分类器,并进行目标检测操作。

首先我们要去加载级联分类器文件(xml文件),这些文件位于D:\Developer\opencv4.8.0\opencv\build\etc目录下,这里我们用的是haarcascade这种基于梯度提升决策树的分类器 (另一种lbpcascade是一种基于局部二值模式LBP的分类器)

haarcascade目录下,我们可以看到haarcascade_frontalface_alt.xml这个文件,就是我们需要的,用于人脸识别的级联分类器了。
在这里插入图片描述
所以,我们加载级联分类器的时候,去指定这个路径D:\Developer\opencv4.8.0\opencv\build\etc\haarcascades\haarcascade_frontalface_alt.xml,需要注意的是,放到代码里,这里的要将\改为/ (或者改为\\也行)。如果不改,那么路径不对,级联分类器会读取出错。

具体代码如下

int main()
{CascadeClassifier face_CascadeClassifier;if (!face_CascadeClassifier.load("D:/Developer/opencv4.8.0/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml")) {cout << "级联分类器加载失败!\n" << endl;return -1;}//这里省略了原本其他的代码 ...
}

7. 进行人脸检测

接下来我们就要进行人脸检测了,人脸检测需要调用detectMultiScale方法,第一个参数 image 需要传入我们刚才处理后的直方图,第二个参数objects会返回所有检测出来的人脸的坐标。

void detectMultiScale( InputArray image,CV_OUT std::vector<Rect>& objects,double scaleFactor = 1.1,int minNeighbors = 3, int flags = 0,Size minSize = Size(),Size maxSize = Size() );

还有一个rectangle方法,用来在得到人脸坐标之后,进行画框。第一个参数img代表要在哪个图像上画框,第二个参数rec表示框的坐标,第三个参数color表示画框的颜色。

void rectangle(InputOutputArray img, Rect rec,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);

主要代码如下所示

std::vector<Rect> faces;
face_CascadeClassifier.detectMultiScale(grayFrame, faces);  //检测人脸for (size_t i = 0; i < faces.size(); i++)
{rectangle(frame,faces[i],Scalar(0,0,255)); //在人脸的位置画红色的框
}

来看一下完整代码

#include "OpenCVTest.h"
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{//加载级联分类器CascadeClassifier face_CascadeClassifier;if (!face_CascadeClassifier.load("D:/Developer/opencv4.8.0/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml")) {cout << "级联分类器加载失败!\n" << endl;return -1;}VideoCapture capture;capture.open(0);if (!capture.isOpened()){cout << "opencv打开摄像头失败!\n" << endl;return -1;}Mat frame; //摄像头彩色图像Mat grayFrame; //摄像头灰度图像Mat equalizeFrame; //直方图while (true){capture >> frame; //从capture中取数据,将画面输出到frame矩阵里面if (frame.empty()){cout << "读取摄像头数据失败!\n" << endl;}//imshow("摄像头", frame); //显示图像//灰度化处理cvtColor(frame, grayFrame, COLOR_BGR2GRAY); //注意 : OpenCV中是BRG//imshow("灰度化", grayFrame); //显示图像//直方图均衡化,用来增强图像对比度,从而让轮廓更加明显equalizeHist(grayFrame, equalizeFrame);//imshow("直方图", equalizeFrame);std::vector<Rect> faces;face_CascadeClassifier.detectMultiScale(grayFrame, faces);  //检测人脸for (size_t i = 0; i < faces.size(); i++){rectangle(frame,faces[i],Scalar(0,0,255));}imshow("摄像头", frame); //显示图像if (waitKey(30) == 27) //ESC键{break;}}return 0;
}

运行程序,来看一下效果

可以看到,人脸已经检测出来了,并对人脸进行了画框。但是可以画面非常的卡顿,因为人脸检测是非常耗时的,可能需要500毫秒甚至1-2秒时间,这里每一帧都去检测人脸,导致了异常卡顿。所以这种方式只适合用来检测静态图像,并不适合用作实时的摄像头人脸跟踪检测。

8. 实现实时人脸跟踪检测

8.1 OpenCV Android Demo

那我们需要来怎么做呢 ? 其实我们可以来看一下官方的示例,我们要去下载官方的Android包,里面有Android的官方示例。

在这里插入图片描述

8.2 DetectionBasedTracker_jni.cpp

我们下载解压后,可以在OpenCV-android-sdk\samples\face-detection\jni目录下找到DetectionBasedTracker_jni.cpp这个文件
在这里插入图片描述
在里面的nativeCreateObject方法里,我们可以发现其调用了这几句代码
在这里插入图片描述

8.3 CascadeDetectorAdapter

CascadeDetectorAdapter是一个适配器类,用于将CascadeClassifierDetector接口适配起来,从而用于检测人脸。

再来看一下CascadeDetectorAdapter这个类,里面的detect方法就是用来检测人脸的
在这里插入图片描述

8.4 DetectorAgregator

然后来看一下第三行代码中的DetectorAgregator,这里面有tracker = makePtr<DetectionBasedTracker>(mainDetector, trackingDetector, DetectorParams);这行代码是我们需要的,用来传入mainDetectortrackingDetector,生成一个tracker对象。
在这里插入图片描述

8.5 开始重新编写代码

这里我们将原来写的人脸检测的代码删除了,代码恢复到了刚配置好OpenCV的初始状态,然后将CascadeDetectorAdapter这个类的代码复制到我们的项目中

class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector
{
public:CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector):IDetector(),Detector(detector){CV_Assert(detector);}void detect(const cv::Mat &Image, std::vector<cv::Rect> &objects){Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);}virtual ~CascadeDetectorAdapter(){}private:CascadeDetectorAdapter();cv::Ptr<cv::CascadeClassifier> Detector;
};

声明 tracker这个对象。

cv::Ptr<DetectionBasedTracker> tracker;

然后创建tracker,并调用run()方法,会启动一个异步线程,后面的人脸检测会在这个异步线程进行检测了。

string stdFileName = "D:/Developer/opencv4.8.0/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml";
//创建一个主检测适配器
cv::Ptr<CascadeDetectorAdapter> mainDetector = makePtr<CascadeDetectorAdapter>(makePtr<CascadeClassifier>(stdFileName));
//创建一个跟踪检测适配器
cv::Ptr<CascadeDetectorAdapter> trackingDetector = makePtr<CascadeDetectorAdapter>(makePtr<CascadeClassifier>(stdFileName));
//创建跟踪器
DetectionBasedTracker::Parameters DetectorParams;
tracker = makePtr<DetectionBasedTracker>(mainDetector, trackingDetector, DetectorParams);
tracker->run();

然后在人脸检测的使用调用tracker->process(grayFrame);进行人脸检测,并调用tracker->getObjects(faces);获得识别出来的人脸。

tracker->process(grayFrame);
tracker->getObjects(faces);

核心代码就是如上所示,接下来我们再来看一下完整的代码

#include "OpenCVTest.h"
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;class CascadeDetectorAdapter : public DetectionBasedTracker::IDetector
{
public:CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector) :IDetector(),Detector(detector){CV_Assert(detector);}void detect(const cv::Mat& Image, std::vector<cv::Rect>& objects){Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);}virtual ~CascadeDetectorAdapter(){}private:CascadeDetectorAdapter();cv::Ptr<cv::CascadeClassifier> Detector;
};cv::Ptr<DetectionBasedTracker> tracker;int main()
{string stdFileName = "D:/Developer/opencv4.8.0/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml";//创建一个主检测适配器cv::Ptr<CascadeDetectorAdapter> mainDetector = makePtr<CascadeDetectorAdapter>(makePtr<CascadeClassifier>(stdFileName));//创建一个跟踪检测适配器cv::Ptr<CascadeDetectorAdapter> trackingDetector = makePtr<CascadeDetectorAdapter>(makePtr<CascadeClassifier>(stdFileName));//创建跟踪器DetectionBasedTracker::Parameters DetectorParams;tracker = makePtr<DetectionBasedTracker>(mainDetector, trackingDetector, DetectorParams);tracker->run();VideoCapture capture;capture.open(0);if (!capture.isOpened()){cout << "opencv打开摄像头失败!\n" << endl;return -1;}Mat frame; //摄像头彩色图像Mat grayFrame; //摄像头灰度图像Mat equalizeFrame; //直方图while (true){capture >> frame; //从capture中取数据,将画面输出到frame矩阵里面if (frame.empty()){cout << "读取摄像头数据失败!\n" << endl;return -1;}//imshow("摄像头", frame); //显示图像//灰度化处理cvtColor(frame, grayFrame, COLOR_BGR2GRAY); //注意 : OpenCV中是BRG//imshow("灰度化", grayFrame); //显示图像//直方图均衡化,用来增强图像对比度,从而让轮廓更加明显equalizeHist(grayFrame, equalizeFrame);//imshow("直方图", equalizeFrame);std::vector<Rect>  faces;tracker->process(grayFrame);tracker->getObjects(faces);for (size_t i = 0; i < faces.size(); i++){rectangle(frame, faces[i], Scalar(0, 0, 255));}imshow("摄像头", frame); //显示图像if (waitKey(30) == 27) //ESC键{break;}}tracker->stop();return 0;
}

8.6 运行效果

运行程序,我们就可以看到本文开头给出的效果了

在这里插入图片描述
至此,我们就使用OpenCV完成实时人脸跟踪识别了。

9. 本文源码下载

使用OpenCV实现人脸识别示例Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux命令200例:adduser用于创建新用户

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

代理模式【Proxy Pattern】

什么是代理模式呢&#xff1f;我很忙&#xff0c;忙的没空理你&#xff0c;那你要找我呢就先找我的代理人吧&#xff0c;那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧&#xff0c;那就是两个人具备同一个接口&#xff0c;代理人虽然不能干活&#xff0c;但是被 代…

解决 Mac 上使用 Electron Updater 更新 App 不成功的问题!!!

文章目录 1. 现象2. 分析并如何解决3. 后续 1. 现象 在Mac电脑上&#xff0c;使用Electron Updater对程序进行更新&#xff0c;但是一直不成功&#xff0c;也不报错。具体表现是这样的&#xff1a;当前我的程序版本是3.11版本&#xff0c;点击更新之后&#xff0c;也下载了&am…

11 迭代器|生成器|协程

文章目录 迭代器可迭代对象可迭代对象的本质iter()函数与 next()函数迭代器 Iterator样例 for...in...循环的本质使用的场景--斐波那契数列list和tuple也可以接收可迭代对象 生成器简介创建生成器方法一方法二总结 使用 send 唤醒 协程协程和线程差异简单实现协程greenletgeven…

微PE工具箱实现U盘重装Windows系统

教程来源 U盘重装Windows系统&#xff08;微PE工具箱&#xff09;_哔哩哔哩_bilibili 加上自己的一丢丢理解&#xff0c;如果你觉得长视频看了犯困&#xff0c;不如看看我的理解文章说不定能够帮助到你 准备工作 到这个网站使用迅雷下载免费无插件的官方镜像MSDN, 我告诉你…

JVM笔记 —— 出现内存溢出错误时时如何排查

一、出现内存溢出的几种情况 内存溢出错误分为StackOverflowError和OutOfMemoryError&#xff0c;前者是栈中出现溢出&#xff0c;后者一般是堆或方法区出现溢出&#xff0c;简称OOM 1. 栈溢出 StackOverflowError 栈溢出一般都是因为没有正确的结束递归导致的&#xff0c;无…

Linux中安装MySQL8版本,安装MySQL步骤,MySQL8离线安装

Linux中安装MySQL8版本的步骤如下&#xff1a; 1.检查下libaio.so.1的位置 [roottdx ]# whereis libaio.so.1 libaio.so: /usr/lib64/libaio.so.1 如果没有找到该文件 (1).在线安装 [roottdx ]# yum install -y libaio (2).离线安装&#xff1a; 上传之后执行命令安装&#…

pymysql 库 - python 操作 mysql

环境&#xff1a; Win10 x64 Python 3.7 PyMySQL 1.0.2 MySQL 8.0.27 1 安装 pip install pymysql 2 地址 https://pypi.org/project/pymysql/ 3.1 数据库版本查询 (search_version.py) import pymysql# 打开数据库连接 try:db pymysql.connect(hostlocalhost, userr…

python安装第三方包时报错:...\lib\site-packages\pip\_vendor\urllib3\response.py...

安装redis第三方包&#xff1a; pip install redis报错现象&#xff1a; 解决方法&#xff1a;使用以下命令可成功安装 pip install redis -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

关于网络入侵检测领域使用Spark/Flink等计算框架做分布式

关于网络入侵检测领域使用Spark/Flink等计算框架做分布式 0、引言1 基于LightGBM的网络入侵检测研究2 基于互信息法的智能化运维系统入侵检测Spark实现3 基于Spark的车联网分布式组合深度学习入侵检测方法4 基于Flink的分布式在线集成学习框架研究5 基于Flink的分布式并行逻辑回…

mongodb基础

mongodb语法 参考文档&#xff1a;https://docs.mongodb.com/manual/reference/ BSON Types BSON Type有2种标识符&#xff0c;整形和字符串 类型数值字符串说明Double1“double”String2“string”Object3“object”Array4“array”Binary data5“binData”Undefined6“un…

8.9黄金最新行情走势分析及短线交易策略

近期有哪些消息面影响黄金走势&#xff1f;黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周三&#xff08;8月9日&#xff09;现货黄金维持震荡&#xff0c;目前交投于1930美元附近&#xff0c;隔日现货黄金盘中震荡下行&#xff0c;失守1930关口并在美盘时段…

【Spring】-Spring的IoC和DI

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Framework】 主要内容&#xff1a;什么是spring&#xff1f;IoC容器是什么&#xff1f;如何使代码解耦合&#xff1f;IoC的核心原理&#xff0c;IoC的优点。依赖注入/对象装配/…

【ARM 嵌入式 编译系列 10 -- GCC 编译缩减可执行文件 elf 文件大小】

文章目录 GCC 如何缩减可执行文件size测试代码 上篇文章&#xff1a;ARM 嵌入式 编译系列 9-- GCC 编译符号表&#xff08;Symbol Table&#xff09;的详细介绍 下篇文章&#xff1a;ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小 GCC 如何缩减可执行文件s…

Linux下在qtcreator中创建qt程序

目录 1、新建项目 2、单工程项目创建 3、多工程项目创建 4、添加子工程&#xff08;基于多工程目录结构&#xff09; 5、 .pro文件 1、新建项目 切换到“编辑”界面&#xff0c;点击菜单栏中的“文件”-“新建文件或项目” 2、单工程项目创建 只有一个工程的项目&#…

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库&#xff0c;一套典型的移动端办公工具型APP Axure RP原型模板&#xff0c;可根据实际的产品需求进行扩展&#xff0c;也可以作为移动端原型设计的参考案例。为提升本作品参考价值&#xff0c;在模板设计过程中尽量追求…

chatGPT应用于房地产行业

作为 2023 年的房地产专业人士&#xff0c;您无疑认识到技术对行业的重大影响。近年来&#xff0c;一项技术进步席卷了世界——人工智能。人工智能彻底改变了房地产业务的各个方面&#xff0c;从简化管理任务到增强客户互动。 在本文中&#xff0c;我们将探讨几种巧妙的人工智…

HTML 语言简介

1.概述 HTML 是网页使用的语言&#xff0c;定义了网页的结构和内容。浏览器访问网站&#xff0c;其实就是从服务器下载 HTML 代码&#xff0c;然后渲染出网页。 HTML 的全名是“超文本标记语言”&#xff08;HyperText Markup Language&#xff09;&#xff0c;上个世纪90年代…

zabbix自动注册服务器以及部署代理服务器

文章目录 Zabbix自动注册服务器及部署代理服务器一.zabbix自动注册1.什么是自动注册2.环境准备3.zabbix客户端配置4.在 Web 页面配置自动注册5.验证自动注册 二.部署 zabbix 代理服务器1.分布式监控的作用&#xff1a;2.环境部署3.代理服务器配置4.客户端配置5.web页面配置5.1 …

MS9940T 国产 模拟前端AFE芯片 11-15 节锂电池或磷酸盐电池管理芯片 替代BQ76940

产品简述 MS9940T 是模拟前端 (AFE) 芯片&#xff0c;支持11 到 15 组电池串联。通过 I 2 C &#xff0c;主机控制器 可以使用 MS9940T 来实现电池组管理功能&#xff0c;例如监控&#xff08;电池电压、电池组电流、电池组 温度&#xff09;、保护&#xff08;控制…