当前位置: 首页 > news >正文

Java使用opencv实现人脸识别、人脸比对

1. opencv概述

OpenCV是一个开源的计算机视觉库,它提供了一系列丰富的图像处理和计算机视觉算法,包括图像读取、显示、滤波、特征检测、目标跟踪等功能。

opencv官网:https://opencv.org/
opencv官网文档:https://docs.opencv.org/4.7.0/index.html
参考教程1:https://www.w3cschool.cn/opencv/
参考教程2:https://www.yiibai.com/opencv/opencv_adding_text.html

2. 安装opencv
2.1 下载opencv

opencv下载:https://opencv.org/releases/
在这里插入图片描述
这里我们使用4.7.0版本,下载到本地后,双击进行安装即可。

进入到opencv的安装目录:
在这里插入图片描述

build :基于window构建sources:开源,提供源码

进入到build\java 目录
在这里插入图片描述

x64与x86目录下是对应的.dll文件:代表给不同的系统使用,下面的代码会使用到.dll文件
opencv-460.jar给java操作openvc的程序包

2.2 准备文件
# 1. 特征分类器:windows 和 linux 中的配置文件都一样,随便用哪个都行
haarcascade_frontalface_alt.xml
# windows 路径 : opencv\build\etc\haarcascades
# linux 路径 : /usr/local/share/opencv4/haarcascades# 2. jar 包 - 也可以直接使用 javacv 中的 opencv 包
opencv-470.jar
# windows 路径 : {opencv安装目录}\opencv\build\java
# linux 路径 : /usr/local/share/java/opencv4# 3. 动态库
opencv_java470.dll (windows系统使用此文件)
# windows 路径 : {opencv安装目录}\opencv\build\java\{x64}/{x86} 跟据系统选择
libopencv_java470.so (linux系统使用此文件)
# linux 路径 : /usr/local/share/java/opencv4
3. 代码实现
3.1 pom.xml添加依赖
<!-- 版本的依赖与下载的opencv版本一致-->
<dependency><groupId>org.bytedeco</groupId><artifactId>opencv</artifactId><version>4.7.0-1.5.9</version></dependency>

或:

        <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.9</version></dependency>

或:

<dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.7.0-0</version></dependency>

以上三个依赖任选其一即可,项目打包后观察一下使用哪个依赖打包后的jar文件更小

实验证明:
javacv-platform依赖的jar最大,达到929.64M
org.openpnp.opencv依赖最小,几乎为0M
org.bytedeco.opencv依赖居中,大小为2M

ps:依赖包太大,优化参考:https://blog.csdn.net/u014644574/article/details/122067708

3.2 编写代码

ps:代码中存在加载.dll、haarcascade_frontalface_alt.xml文件,请确保文件地址正确

package com.testpro.test.opencv;import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;import java.util.Arrays;public class FaceCompare {// 初始化人脸探测器static CascadeClassifier faceDetector;private static final String PATH_PREFIX = "C:\\Users\\dev\\Desktop\\";static int i = 0;static {// 判断系统String os = System.getProperty("os.name");// 加载动态库if (os != null && os.toLowerCase().startsWith("windows")) {// Windows操作系统// todo windows 系统部署加载 .dll 文件 - 路径跟据自己存放位置更改【这里需要使用绝对路径】System.load("D:\\opencv\\opencv\\build\\java\\x64\\opencv_java470.dll");} else if (os != null && os.toLowerCase().startsWith("linux")) {// Linux操作系统// todo Linux 服务器部署加载 .so 文件 - 路径跟据自己存放位置更改【是否需要绝对路径有待验证,目前只在windows 系统实践过】System.load("/opt/face/libopencv_java440.so");}// 引入 特征分类器配置 文件:haarcascade_frontalface_alt.xml 文件路径// 此文件在opencv的安装目录build\etc\haarcascades下可以找到String property = "D:\\opencv\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml";System.out.println(property);faceDetector = new CascadeClassifier(property);}public static void main(String[] args) {// 图片路径不能包含中文String str1 = PATH_PREFIX + "3-1.jpg";String str2 = PATH_PREFIX + "3-2.jpg";long start = System.currentTimeMillis();double compareHist = compare_image(str1, str2);System.out.println("time:" + (System.currentTimeMillis() - start));System.out.println(compareHist);if (compareHist > 0.6) {System.out.println("人脸匹配");} else {System.out.println("人脸不匹配");}}// 灰度化人脸public static Mat conv_Mat(String img) {Mat image0 = Imgcodecs.imread(img);Mat image1 = new Mat();// 灰度化Imgproc.cvtColor(image0, image1, Imgproc.COLOR_BGR2GRAY);// 探测人脸MatOfRect faceDetections = new MatOfRect();faceDetector.detectMultiScale(image1, faceDetections);// rect中人脸图片的范围for (Rect rect : faceDetections.toArray()) {Mat face = new Mat(image1, rect);return face;}return null;}// 比较图片public static double compare_image(String img_1, String img_2) {Mat mat_1 = conv_Mat(img_1);Mat mat_2 = conv_Mat(img_2);Mat hist_1 = new Mat();Mat hist_2 = new Mat();//颜色范围MatOfFloat ranges = new MatOfFloat(0f, 256f);//直方图大小, 越大匹配越精确 (越慢)MatOfInt histSize = new MatOfInt(10000000);Imgproc.calcHist(Arrays.asList(mat_1), new MatOfInt(0), new Mat(), hist_1, histSize, ranges);Imgproc.calcHist(Arrays.asList(mat_2), new MatOfInt(0), new Mat(), hist_2, histSize, ranges);// CORREL 相关系数double res = Imgproc.compareHist(hist_1, hist_2, Imgproc.CV_COMP_CORREL);return res;}}

上述代码加载.dll文件也可使用以下方式:

ps:【不过以下方式需要将opencv安装目录下的build\java\x64\opencv_java470.dll文件复制到C:\Windows\System32目录下才可使用否则会报错】

// 使用此方法需将D:\opencv\opencv\build\java\x64\opencv_java470.dll文件复制到C:\Windows\System32目录下
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

如下:
在这里插入图片描述

4. 效果

在这里插入图片描述

5. 附:完整代码

包括:
从摄像头实时人脸识别,识别成功保存图片到本地
从本地视频文件中识别人脸
本地图片人脸识别,识别成功并保存人脸图片到本地

package com.testpro.test.opencv;import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.VideoWriter;
import org.opencv.videoio.Videoio;import java.util.Arrays;/*** Opencv 图片人脸识别、实时摄像头人脸识别、视频文件人脸识别*/
public class FaceVideo {// 初始化人脸探测器static CascadeClassifier faceDetector;static int i = 0;static {// 判断系统String os = System.getProperty("os.name");// 加载动态库if (os != null && os.toLowerCase().startsWith("windows")) {// Windows操作系统// todo windows 系统部署加载 .dll 文件 - 路径跟据自己存放位置更改System.load("D:\\opencv\\opencv\\build\\java\\x64\\opencv_java470.dll");
//            ClassLoader.getSystemResource("dlls/opencv_java470.dll");} else if (os != null && os.toLowerCase().startsWith("linux")) {// Linux操作系统// todo Linux 服务器部署加载 .so 文件 - 路径跟据自己存放位置更改System.load("/opt/face/libopencv_java440.so");}// 引入 特征分类器配置 文件:haarcascade_frontalface_alt.xml 文件路径String property = "D:\\opencv\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml";System.out.println(property);faceDetector = new CascadeClassifier(property);}private static final String PATH_PREFIX = "C:\\Users\\dev\\Desktop\\";public static void main(String[] args) {// 1- 从摄像头实时人脸识别,识别成功保存图片到本地
//        getVideoFromCamera();// 2- 从本地视频文件中识别人脸
//        getVideoFromFile();// 3- 本地图片人脸识别,识别成功并保存人脸图片到本地
//        face("5-1.jpg");// 4- 比对本地2张图的人脸相似度 (越接近1越相似)double compareHist = compare_image(PATH_PREFIX + "5-1.jpg", PATH_PREFIX + "6-1.jpg");System.out.println(compareHist);if (compareHist > 0.72) {System.out.println("人脸匹配");} else {System.out.println("人脸不匹配");}}/*** OpenCV-4.7.0 从摄像头实时读取*/public static void getVideoFromCamera() {//1 如果要从摄像头获取视频 则要在 VideoCapture 的构造方法写 0VideoCapture capture = new VideoCapture(0);Mat video = new Mat();int index = 0;if (capture.isOpened()) {while (i < 3) {// 匹配成功3次退出capture.read(video);HighGui.imshow("实时人脸识别", getFace(video));index = HighGui.waitKey(100);if (index == 27) {capture.release();break;}}} else {System.out.println("摄像头未开启");}try {capture.release();Thread.sleep(1000);System.exit(0);} catch (InterruptedException e) {e.printStackTrace();}return;}/*** OpenCV-4.7.0 从视频文件中读取*/public static void getVideoFromFile() {VideoCapture capture = new VideoCapture();capture.open(PATH_PREFIX + "yimi.mp4");//1 读取视频文件的路径if (!capture.isOpened()) {System.out.println("读取视频文件失败!");return;}Mat video = new Mat();int index = 0;while (capture.isOpened()) {capture.read(video);//2 视频文件的视频写入 Mat video 中HighGui.imshow("本地视频识别人脸", getFace(video));//3 显示图像index = HighGui.waitKey(100);//4 获取键盘输入if (index == 27) {//5 如果是 Esc 则退出capture.release();return;}}}/*** OpenCV-4.7.0 人脸识别** @param image 待处理Mat图片(视频中的某一帧)* @return 处理后的图片*/public static Mat getFace(Mat image) {// 1 读取OpenCV自带的人脸识别特征XML文件(faceDetector)
//        CascadeClassifier facebook = new CascadeClassifier("D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");// 2 特征匹配类MatOfRect face = new MatOfRect();// 3 特征匹配faceDetector.detectMultiScale(image, face);Rect[] rects = face.toArray();System.out.println("匹配到 " + rects.length + " 个人脸");if (rects != null && rects.length >= 1) {// 4 为每张识别到的人脸画一个圈for (int i = 0; i < rects.length; i++) {Imgproc.rectangle(image, new Point(rects[i].x, rects[i].y), new Point(rects[i].x + rects[i].width, rects[i].y + rects[i].height), new Scalar(0, 255, 0));Imgproc.putText(image, "Human", new Point(rects[i].x, rects[i].y), Imgproc.FONT_HERSHEY_SCRIPT_SIMPLEX, 1.0, new Scalar(0, 255, 0), 1, Imgproc.LINE_AA, false);//Mat dst=image.clone();//Imgproc.resize(image, image, new Size(300,300));}i++;if (i == 3) {// 获取匹配成功第10次的照片Imgcodecs.imwrite(PATH_PREFIX + "face.png", image);}}return image;}/*** OpenCV-4.7.0 图片人脸识别*/public static void face(String filename) {// 1 读取OpenCV自带的人脸识别特征XML文件// OpenCV 图像识别库一般位于 opencv\sources\data 下面
//        CascadeClassifier facebook=new CascadeClassifier("D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");// 2 读取测试图片String imgPath = PATH_PREFIX + filename;Mat image = Imgcodecs.imread(imgPath);if (image.empty()) {System.out.println("image 内容不存在!");return;}// 3 特征匹配MatOfRect face = new MatOfRect();faceDetector.detectMultiScale(image, face);// 4 匹配 Rect 矩阵 数组Rect[] rects = face.toArray();System.out.println("匹配到 " + rects.length + " 个人脸");// 5 为每张识别到的人脸画一个圈int i = 1;for (Rect rect : face.toArray()) {Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),new Scalar(0, 255, 0), 3);imageCut(imgPath, PATH_PREFIX + i + ".jpg", rect.x, rect.y, rect.width, rect.height);// 进行图片裁剪i++;}// 6 展示图片HighGui.imshow("人脸识别", image);HighGui.waitKey(0);}/*** 裁剪人脸** @param imagePath* @param outFile* @param posX* @param posY* @param width* @param height*/public static void imageCut(String imagePath, String outFile, int posX, int posY, int width, int height) {// 原始图像Mat image = Imgcodecs.imread(imagePath);// 截取的区域:参数,坐标X,坐标Y,截图宽度,截图长度Rect rect = new Rect(posX, posY, width, height);// 两句效果一样Mat sub = image.submat(rect); // Mat sub = new Mat(image, rect);Mat mat = new Mat();Size size = new Size(width, height);Imgproc.resize(sub, mat, size);// 将人脸进行截图并保存Imgcodecs.imwrite(outFile, mat);System.out.println(String.format("图片裁切成功,裁切后图片文件为: %s", outFile));}/*** 人脸比对** @param img_1* @param img_2* @return*/public static double compare_image(String img_1, String img_2) {Mat mat_1 = conv_Mat(img_1);Mat mat_2 = conv_Mat(img_2);Mat hist_1 = new Mat();Mat hist_2 = new Mat();//颜色范围MatOfFloat ranges = new MatOfFloat(0f, 256f);//直方图大小, 越大匹配越精确 (越慢)MatOfInt histSize = new MatOfInt(1000);Imgproc.calcHist(Arrays.asList(mat_1), new MatOfInt(0), new Mat(), hist_1, histSize, ranges);Imgproc.calcHist(Arrays.asList(mat_2), new MatOfInt(0), new Mat(), hist_2, histSize, ranges);// CORREL 相关系数double res = Imgproc.compareHist(hist_1, hist_2, Imgproc.CV_COMP_CORREL);return res;}/*** 灰度化人脸** @param img* @return*/public static Mat conv_Mat(String img) {Mat image0 = Imgcodecs.imread(img);Mat image1 = new Mat();// 灰度化Imgproc.cvtColor(image0, image1, Imgproc.COLOR_BGR2GRAY);// 探测人脸MatOfRect faceDetections = new MatOfRect();faceDetector.detectMultiScale(image1, faceDetections);// rect中人脸图片的范围for (Rect rect : faceDetections.toArray()) {Mat face = new Mat(image1, rect);return face;}return null;}/*** OpenCV-4.7.0 将摄像头拍摄的视频写入本地*/public static void writeVideo() {//1 如果要从摄像头获取视频 则要在 VideoCapture 的构造方法写 0VideoCapture capture = new VideoCapture(0);Mat video = new Mat();int index = 0;Size size = new Size(capture.get(Videoio.CAP_PROP_FRAME_WIDTH), capture.get(Videoio.CAP_PROP_FRAME_HEIGHT));VideoWriter writer = new VideoWriter("D:/a.mp4", VideoWriter.fourcc('D', 'I', 'V', 'X'), 15.0, size, true);while (capture.isOpened()) {capture.read(video);//2 将摄像头的视频写入 Mat video 中writer.write(video);HighGui.imshow("像头获取视频", video);//3 显示图像index = HighGui.waitKey(100);//4 获取键盘输入if (index == 27) {//5 如果是 Esc 则退出capture.release();writer.release();return;}}}}

相关文章:

Java使用opencv实现人脸识别、人脸比对

1. opencv概述 OpenCV是一个开源的计算机视觉库&#xff0c;它提供了一系列丰富的图像处理和计算机视觉算法&#xff0c;包括图像读取、显示、滤波、特征检测、目标跟踪等功能。 opencv官网&#xff1a;https://opencv.org/ opencv官网文档&#xff1a;https://docs.opencv.or…...

Redis HyperLogLog的使用

Redis HyperLogLog知识总结 一、简介二、使用 一、简介 Redis HyperLogLog是一种数据结构&#xff0c;用于高效地计算基数&#xff08;集合中唯一元素的数量&#xff09;。它的主要作用是用于在内存中高效地存储和计算大量数据的基数&#xff0c;而无需完全存储所有的数据。Hy…...

Apisix-Ingress服务发现详解

apisix Apache APISIX 是一个基于微服务 API 网关&#xff0c;其不仅可以处理南北向的流量&#xff0c;也可以处理东西向的流量即服务之间的流量。Apache APISIX 集成了控制面板和数据面&#xff0c;与其他 API 网关相比&#xff0c;Apache APISIX 的上游、路由、插件全是动态的…...

spring6-事务

文章目录 1、JdbcTemplate1.1、简介1.2、准备工作1.3、实现CURD①装配 JdbcTemplate②测试增删改功能③查询数据返回对象④查询数据返回list集合⑤查询返回单个的值 2、声明式事务概念2.1、事务基本概念①什么是事务②事务的特性 2.2、编程式事务2.3、声明式事务 3、基于注解的…...

JavaFx学习问题2--音频、视频播放失败情况

文章目录 一、路径注意事项&#xff1a;① 用相对路径的时候别忘了前面的斜杠② uri问题 二、播放不了的问题① 获取的媒体文件路径本身就是不对的② 必须是uri③ 特殊情况 额外收获: 一、路径注意事项&#xff1a; 完整代码如下: import javafx.application.Application; im…...

第55节—— redux-toolkit中的createReducer——了解

一、概念 当我们使用 Redux 开发应用程序时&#xff0c;一个非常重要的概念就是 reducer。一个 reducer 是一个纯函数&#xff0c;它接受先前的状态和一个动作&#xff0c;然后返回一个新状态。每个动作都会引起状态的变化&#xff0c;从而使应用程序状态管理更加清晰和可控。…...

JUC并发编程——JUC并发编程概述及Lock锁(重点)(基于狂神说的学习笔记)

基于bilibili狂神说JUC并发编程视频所做笔记 概述 什么是JUC JUC时java.util工具包中的三个包的简称 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 业务&#xff1a;普通的线程代码中&#xff0c;我们常使用Runnable接口 但Runnable没有返…...

深入了解 Java 中的时间信息定义、转换、比较和操作

1. 简介 在过去的传统Java日期处理中&#xff0c;经常面临着一些问题。比如&#xff0c;java.util.Date和java.util.Calendar在表示日期和时间时存在着一些奇怪的行为&#xff0c;如月份从0开始计数、对日期进行格式化的方式繁琐不直观等。这些问题给开发带来了一定的困扰。 …...

2023年中国智能矿山发展历程及趋势分析:智能矿山健康有序发展[图]

智能矿山系统对矿山生产提质增效的效果已经开始显现&#xff1a;对不合规、有风险的行动进行及时预警&#xff0c;减少安全事故发生概率&#xff0c;避免因停产整顿产生的巨额亏损&#xff1b;精细化管理整个生产流程&#xff0c;避免过往传统粗放的流程导致的浪费&#xff0c;…...

acwing算法基础之基础算法--整数离散化算法

目录 1 知识点2 模板 1 知识点 整个范围很大&#xff0c;但存在的数据点很少。比如从 − 1 0 9 -10^9 −109到 1 0 9 10^9 109&#xff0c;但总共只有 1 0 6 10^6 106个数。 可以采用离散化的思想来做&#xff0c;即将离散的大数值映射成连续的小数值&#xff08;一般是 1 , …...

基于SSM框架的安全教育平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

Kafka生产者使用案例

1.生产者发送消息的过程 首先介绍一下 Kafka 生产者发送消息的过程&#xff1a; 1)Kafka 会将发送消息包装为 ProducerRecord 对象&#xff0c; ProducerRecord 对象包含了目标主题和要发送的内容&#xff0c;同时还可以指定键和分区。在发送 ProducerRecord 对象前&#xff0c…...

EasyX图形库实现贪吃蛇游戏

⭐大家好&#xff0c;我是Dark Falme Masker,学习了动画制作及键盘交互之后&#xff0c;我们就可以开动利用图形库写一个简单的贪吃蛇小游戏&#xff0c;增加学习乐趣。 ⭐专栏&#xff1a;EasyX部分小游戏实现详细讲解 最终效果如下 首先包含头文件 #include<stdio.h> #…...

利用 Amazon CodeWhisperer 激发孩子的编程兴趣

我是一个程序员&#xff0c;也是一个父亲。工作之余我会经常和儿子聊他们小学信息技术课学习的 Scratch 和 Kitten 这两款图形化的少儿编程工具。 我儿子有一次指着书房里显示器上显示的 Visual Studio Code 问我&#xff0c;“为什么我们上课用的开发界面&#xff0c;和爸爸你…...

2023年中国分子筛稀土催化材料竞争格局及行业市场规模分析[图]

稀土催化材料能够起到提高催化剂热稳定性、催化剂活性、催化剂储氧能力&#xff0c;以及减少贵金属活性组分用量等作用&#xff0c;广泛应用于石油化工、汽车尾气净化、工业废气和人居环境净化、燃料电池等领域。 2015-2023年中国稀土催化材料规模及预测 资料来源&#xff1a;…...

vue3插件——vue-web-screen-shot——实现页面截图功能

最近在看前同事发我的vue3框架时&#xff0c;发现他们有个功能是要实现页面截图功能。 vue3插件——vue-web-screen-shot——实现页面截图功能 效果图如下&#xff1a;1.操作步骤1.1在项目中添加vvue-web-screen-shot组件1.2在项目入口文件导入组件——main.ts1.3在需要使用的页…...

简单总结Centos7安装Tomcat10.0版本

文章目录 前言JDK8安装部署Tomcat 前言 注意jdk与tomcat的兼容问题&#xff0c;其他的只要正确操作一般问题不大 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomca…...

ffmpeg中AVCodecContext和AVCodec的关系分析

怎么理解AVCodecContext和AVCodec的关系 AVCodecContext和AVCodec是FFmpeg库中两个相关的结构体&#xff0c;它们在音视频编解码中扮演着不同的角色。 AVCodecContext&#xff1a;是编解码器上下文结构体&#xff0c;用于存储音视频编解码器的参数和状态信息。它包含了进行音视…...

2023年中国门把手产量、销量及市场规模分析[图]

门把手行业是指专门从事门把手的设计、制造、销售和安装等相关业务的行业。门把手是门窗装饰硬件的一种&#xff0c;用于开启和关闭门窗&#xff0c;同时也具有装饰和美化门窗的作用。 门把手行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着消…...

HTML 核心技术点基础详细解析以及综合小案例

核心技术点 网页组成 排版标签 多媒体标签及属性 综合案例一 - 个人简介 综合案例二 - Vue 简介 02-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本&#xff1a;链接 标记&#xff1a;标签&#xff0c;带尖括号的文本 标签结构 标签要成…...

ChatGPT资源宝库:从提示工程到项目实践的完整指南

1. 项目概述&#xff1a;一份关于ChatGPT的“Awesome”清单意味着什么&#xff1f;如果你最近在GitHub上搜索过任何与ChatGPT、AI或提示工程相关的内容&#xff0c;那么你大概率见过一个以“awesome-”开头的仓库。而sindresorhus/awesome-chatgpt无疑是这个领域里最知名、最常…...

如何快速掌握openpilot:从零到精通的自动驾驶系统终极指南

如何快速掌握openpilot&#xff1a;从零到精通的自动驾驶系统终极指南 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_Tre…...

别再死记硬背公式了!用Python+NumPy手把手带你仿真RLC串联谐振(附代码)

用PythonNumPy动态仿真RLC串联谐振&#xff1a;告别枯燥公式&#xff0c;直观理解电路本质 当你第一次翻开电路分析教材&#xff0c;看到那些密密麻麻的公式推导和抽象的频率响应曲线时&#xff0c;是否感到一阵眩晕&#xff1f;RLC串联谐振作为电路分析的核心概念&#xff0c;…...

如何在10分钟内搭建个人游戏流媒体服务器:Sunshine跨平台游戏串流完全指南

如何在10分钟内搭建个人游戏流媒体服务器&#xff1a;Sunshine跨平台游戏串流完全指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 您是否梦想过在任何设备上畅玩PC游戏&#x…...

生物信息学逆向解析mRNA疫苗序列:从公开数据组装BNT-162b2与mRNA-1273的基因蓝图

1. 项目概述与背景解析 最近在生物信息学和疫苗研究领域&#xff0c;一个名为“NAalytics/Assemblies-of-putative-SARS-CoV2-spike-encoding-mRNA-sequences-for-vaccines-BNT-162b2-and-mRNA-1273”的项目引起了我的注意。这个项目标题看起来很长&#xff0c;但核心非常明确&…...

开源办公套件自动化部署与集成实战:基于OpenOffice的服务化解决方案

1. 项目概述&#xff1a;为什么我们需要一个“开源”的办公套件&#xff1f;如果你在GitHub上搜索过办公软件相关的仓库&#xff0c;大概率会看到过longyangxi/OpenOffice这个项目。乍一看&#xff0c;你可能会以为这是一个Apache OpenOffice的镜像或者某个分支。但点进去仔细研…...

AI驱动工作流自动化:从原理到实践,构建智能效率引擎

1. 项目概述&#xff1a;当AI遇上工作流&#xff0c;一场效率革命正在发生最近在GitHub上看到一个名为“WorkflowAI/WorkflowAI”的项目&#xff0c;这个名字本身就充满了想象空间。作为一个长期与各种自动化工具和效率方法论打交道的人&#xff0c;我立刻意识到&#xff0c;这…...

Pixel Framebuf库:图形化编程驱动LED矩阵,告别底层坐标换算

1. 项目概述&#xff1a;告别点灯&#xff0c;拥抱图形化LED矩阵编程如果你玩过Arduino或者树莓派&#xff0c;大概率接触过WS2812B这类可寻址LED&#xff0c;也就是大家常说的NeoPixel。单个灯珠的控制很简单&#xff0c;setPixelColor一下就能亮。但当你面对一个8x8、16x16甚…...

Cursor与Figma通过MCP协议实现AI辅助设计与开发同步

1. 项目概述&#xff1a;当代码编辑器与设计工具“开口说话”最近在开发者社区里&#xff0c;一个名为“cursor-talk-to-figma-mcp”的项目引起了我的注意。这个由开发者“hamadoun1760”开源的仓库&#xff0c;名字直译过来就是“Cursor与Figma对话的MCP”。乍一看&#xff0c…...

DOM 浏览器

DOM 浏览器 引言 DOM(文档对象模型)是浏览器中处理HTML和XML文档的标准方式。它允许开发人员通过编程方式访问和操作网页内容。本文将详细介绍DOM的概念、其在浏览器中的运用以及相关的编程技巧。 DOM简介 什么是DOM? DOM(Document Object Model)是一种跨平台和语言独…...