WinForms 应用中集成 OpenCvSharp 实现基础图像处理
引言
欢迎关注dotnet研习社,今天我们要讨论的主题是WinForms 应用中集成 OpenCvSharp 实现基础图像处理
。
在常规的图像处理软件开发中,图像处理功能是这些应用程序的核心组成部分。无论是简单的照片编辑工具,还是复杂的计算机视觉应用,都需要强大的图像处理库的支持。对于 .NET 开发者来说,OpenCvSharp 是一个优秀的选择,它是 OpenCV(开源计算机视觉库)的 .NET 包装器,提供了丰富的图像处理和计算机视觉功能。
你是否曾经想过如何在 WinForms 应用中实现专业级的图像处理功能? 本教程将带你一步步实现这一目标,从环境搭建到具体功能实现,全面介绍如何在 WinForms 应用中集成 OpenCvSharp。
本教程你将学到:
- OpenCvSharp 的基本概念和安装配置
- WinForms 项目创建和界面设计
- 图像加载与显示的实现
- 基础图像处理算法的应用(灰度转换、高斯模糊、边缘检测、二值化)
- 图像保存与资源管理
- 常见问题与解决方案
让我们开始这段图像处理的旅程吧!
1. 环境准备与项目创建
1.1 OpenCvSharp 简介
OpenCvSharp 是一个针对 .NET 平台的 OpenCV 包装器,它允许 C# 开发者直接调用 OpenCV 的强大功能。与直接使用 C++ 版本的 OpenCV 相比,OpenCvSharp 提供了更加友好的 API 和更好的 .NET 集成体验。
OpenCvSharp 的主要特点:
- 完整封装 OpenCV 的功能
- 符合 .NET 编程风格的 API 设计
- 良好的性能和内存管理
- 支持 Windows、Linux 和 macOS 平台
- 活跃的社区支持和更新
1.2 创建 WinForms 项目
首先,让我们创建一个新的 WinForms 项目:
- 打开 Visual Studio 2022
- 选择"创建新项目"
- 在项目类型列表中选择"Windows 窗体应用 (.NET)"
- 输入项目名称(例如:WinFormsOpenCvSharp)
- 选择 .NET 8.0 或更高版本作为目标框架
- 点击"创建"按钮完成项目创建
1.3 安装 OpenCvSharp NuGet 包
在创建好项目后,我们需要安装 OpenCvSharp 相关的 NuGet 包:
- 在"解决方案资源管理器"中右键点击项目名称
- 选择"管理 NuGet 包"
- 在"浏览"选项卡中搜索"OpenCvSharp4"
- 安装以下三个包:
- OpenCvSharp4(核心功能包)
- OpenCvSharp4.Extensions(提供与 System.Drawing 的互操作功能)
- OpenCvSharp4.runtime.win(Windows 平台特定的运行时文件)
- OpenCvSharp4.Windows(Windows 平台特定的二进制文件)
安装完成后,你的项目文件(.csproj)应该包含类似以下的引用:
你知道为什么需要安装这四个包吗? OpenCvSharp4 提供核心功能,Extensions 包允许我们在 WinForms 的 PictureBox 控件中显示 OpenCV 的 Mat 对象,而runtime.win和 Windows 包则提供了特定于 Windows 平台的运行时和本地库。
2. 界面设计
一个好的用户界面对于图像处理应用至关重要。我们将设计一个简洁而功能完备的界面,包括图像显示区域和各种处理按钮。
2.1 主窗体设计
我们的界面将包含以下元素:
- 两个 PictureBox 控件(分别显示原始图像和处理后的图像)
- 一组按钮(加载图像、灰度转换、高斯模糊、边缘检测、二值化、保存图像)
- 图像信息显示标签
打开 Form1.cs[Design] 视图,按照以下步骤设计界面:
- 将窗体大小调整为适当尺寸(例如 1024x600)
- 添加一个 TableLayoutPanel 控件,设置为 2 列 3 行的布局
- 在第一行添加一个 Panel 控件,用于放置按钮
- 在第二行的两个单元格中分别添加两个 PictureBox 控件
- 在第三行的两个单元格中分别添加两个 Label 控件,用于显示图像标题
- 在 Panel 中添加所需的按钮和标签
完成后,你的界面应该类似于以下结构:
2.2 控件属性设置
为了获得更好的用户体验,我们需要设置一些关键控件属性:
-
PictureBox 控件:
- SizeMode 设置为 Zoom(确保图像适应控件大小)
- Dock 设置为 Fill(填充整个单元格)
- BackColor 设置为浅灰色(便于区分未加载图像的状态)
-
按钮控件:
- 除了"加载图像"按钮外,其他处理按钮初始状态设为禁用(Enabled = false)
- 设置合适的按钮文本和大小
-
标签控件:
- TextAlign 设置为 MiddleCenter(文本居中显示)
- Dock 设置为 Fill(填充整个单元格)
3. 核心功能实现
现在,让我们开始实现应用的核心功能。首先,我们需要在 MainForm.cs 文件的顶部添加必要的 using 语句:
using System;
using System.Drawing;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;
3.1 定义成员变量
在 MainForm 类中,我们需要定义两个成员变量来存储原始图像和处理后的图像:
private Mat? originalImage = null;
private Mat? processedImage = null;
为什么使用 Mat 类型? Mat(Matrix)是 OpenCV 中表示图像的核心数据结构,它可以存储各种类型的图像数据,包括彩色图像、灰度图像等。使用 ?
表示这些变量可以为 null,这是 C# 的可空引用类型特性。
3.2 图像加载功能
首先,我们实现加载图像的功能:
private void btnLoadImage_Click(object sender, EventArgs e)
{using (OpenFileDialog openFileDialog = new OpenFileDialog()){openFileDialog.Filter = "图像文件|*.jpg;*.jpeg;*.png;*.bmp|所有文件|*.*";openFileDialog.Title = "选择图像文件";if (openFileDialog.ShowDialog() == DialogResult.OK){try{// 释放之前的图像资源originalImage?.Dispose();processedImage?.Dispose();// 加载新图像originalImage = Cv2.ImRead(openFileDialog.FileName, ImreadModes.Color);DisplayImage(originalImage, pictureBoxOriginal);// 启用处理按钮EnableProcessingButtons(true);// 显示图像信息lblImageInfo.Text = $"尺寸: {originalImage.Width}x{originalImage.Height}, 通道: {originalImage.Channels()}";}catch (Exception ex){MessageBox.Show($"加载图像时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}}}
}
注意事项:
- 使用
Cv2.ImRead
方法加载图像,这是 OpenCvSharp 中读取图像的标准方法 - 指定
ImreadModes.Color
参数以确保图像以彩色模式加载 - 在加载新图像前释放旧图像资源,避免内存泄漏
- 捕获异常并显示友好的错误消息
3.3 图像显示功能
为了在 PictureBox 中显示 OpenCV 的 Mat 对象,我们需要一个辅助方法:
private void DisplayImage(Mat image, PictureBox pictureBox)
{if (image == null) return;// 释放之前的图像资源if (pictureBox.Image != null){pictureBox.Image.Dispose();pictureBox.Image = null;}// 将Mat转换为Bitmap并显示using (Bitmap bitmap = BitmapConverter.ToBitmap(image)){// 创建一个新的Bitmap副本,因为PictureBox会在释放时处理它pictureBox.Image = new Bitmap(bitmap);}
}
为什么需要创建 Bitmap 副本? 这是因为 BitmapConverter.ToBitmap
方法返回的 Bitmap 对象与原始 Mat 对象共享内存。如果我们直接将其赋值给 PictureBox.Image,然后在其他地方修改或释放 Mat 对象,可能会导致显示问题或崩溃。创建副本可以避免这个问题。
3.4 图像处理功能
现在,让我们实现各种图像处理功能:
3.4.1 灰度转换
private void btnGrayscale_Click(object sender, EventArgs e)
{if (originalImage == null) return;try{// 释放之前处理的图像processedImage?.Dispose();// 转换为灰度图processedImage = new Mat();Cv2.CvtColor(originalImage, processedImage, ColorConversionCodes.BGR2GRAY);DisplayImage(processedImage, pictureBoxProcessed);}catch (Exception ex){MessageBox.Show($"处理图像时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}
}
灰度转换原理: 灰度转换是将彩色图像转换为灰度图像的过程。在 OpenCV 中,使用 Cv2.CvtColor
方法并指定 ColorConversionCodes.BGR2GRAY
参数来实现这一转换。灰度图像只有一个通道,每个像素的值表示亮度,范围从 0(黑)到 255(白)。
3.4.2 高斯模糊
private void btnBlur_Click(object sender, EventArgs e)
{if (originalImage == null) return;try{// 释放之前处理的图像processedImage?.Dispose();// 应用高斯模糊processedImage = new Mat();Cv2.GaussianBlur(originalImage, processedImage, new OpenCvSharp.Size(15, 15), 0);DisplayImage(processedImage, pictureBoxProcessed);}catch (Exception ex){MessageBox.Show($"处理图像时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}
}
高斯模糊原理: 高斯模糊是一种常用的图像平滑技术,它使用高斯函数(正态分布)作为卷积核对图像进行处理。这种模糊可以减少图像噪声和细节,常用于图像预处理。参数 new Size(15, 15)
指定了卷积核的大小,数值越大模糊效果越强。
你能想到高斯模糊的实际应用场景吗? 它常用于降噪、减少图像细节以便于后续处理(如边缘检测),以及创造美术效果。
3.4.3 Canny 边缘检测
private void btnCanny_Click(object sender, EventArgs e)
{if (originalImage == null) return;try{// 释放之前处理的图像processedImage?.Dispose();// 应用Canny边缘检测Mat grayImage = new Mat();Cv2.CvtColor(originalImage, grayImage, ColorConversionCodes.BGR2GRAY);processedImage = new Mat();Cv2.Canny(grayImage, processedImage, 100, 200);DisplayImage(processedImage, pictureBoxProcessed);grayImage.Dispose();}catch (Exception ex){MessageBox.Show($"处理图像时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}
}
Canny 边缘检测原理: Canny 边缘检测是一种流行的边缘检测算法,它通过以下步骤工作:
- 将图像转换为灰度
- 应用高斯滤波器减少噪声
- 计算图像梯度(强度和方向)
- 应用非最大抑制
- 应用双阈值法检测和连接边缘
参数 100
和 200
分别是低阈值和高阈值,它们决定了哪些梯度值被视为边缘。
3.4.4 图像二值化
private void btnThreshold_Click(object sender, EventArgs e)
{if (originalImage == null) return;try{// 释放之前处理的图像processedImage?.Dispose();// 应用二值化Mat grayImage = new Mat();Cv2.CvtColor(originalImage, grayImage, ColorConversionCodes.BGR2GRAY);processedImage = new Mat();Cv2.Threshold(grayImage, processedImage, 127, 255, ThresholdTypes.Binary);DisplayImage(processedImage, pictureBoxProcessed);grayImage.Dispose();}catch (Exception ex){MessageBox.Show($"处理图像时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}
}
二值化原理: 二值化是将灰度图像转换为只有黑白两种颜色的图像的过程。在 OpenCV 中,使用 Cv2.Threshold
方法实现这一功能。参数 127
是阈值,低于此值的像素将变为黑色(0),高于此值的像素将变为白色(255)。ThresholdTypes.Binary
指定了二值化的类型。
思考问题:如何选择合适的阈值? 固定阈值(如 127)可能不适用于所有图像。在实际应用中,可以使用自适应阈值方法(如 Otsu 方法)或允许用户通过滑块调整阈值。
3.5 图像保存功能
最后,我们实现保存处理后图像的功能:
private void btnSaveImage_Click(object sender, EventArgs e)
{if (processedImage == null) return;using (SaveFileDialog saveFileDialog = new SaveFileDialog()){saveFileDialog.Filter = "JPEG图像|*.jpg|PNG图像|*.png|BMP图像|*.bmp|所有文件|*.*";saveFileDialog.Title = "保存处理后的图像";saveFileDialog.DefaultExt = "jpg";if (saveFileDialog.ShowDialog() == DialogResult.OK){try{Cv2.ImWrite(saveFileDialog.FileName, processedImage);MessageBox.Show("图像已成功保存!", "保存成功", MessageBoxButtons.OK, MessageBoxIcon.Information);}catch (Exception ex){MessageBox.Show($"保存图像时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}}}
}
注意事项: 使用 Cv2.ImWrite
方法保存图像,该方法会根据文件扩展名自动选择合适的编码格式。
3.6 辅助方法
为了简化代码,我们添加一个辅助方法来启用或禁用处理按钮:
private void EnableProcessingButtons(bool enable)
{btnGrayscale.Enabled = enable;btnBlur.Enabled = enable;btnCanny.Enabled = enable;btnThreshold.Enabled = enable;btnSaveImage.Enabled = enable;
}
3.7 资源释放
为了避免内存泄漏,我们需要在窗体关闭时释放所有资源:
protected override void OnFormClosing(FormClosingEventArgs e)
{base.OnFormClosing(e);// 释放资源originalImage?.Dispose();processedImage?.Dispose();
}
4. 运行与测试
现在,我们的应用已经准备就绪!按 F5 运行应用,然后按照以下步骤测试功能:
- 点击"加载图像"按钮,选择一张图片
- 尝试各种图像处理按钮,观察效果
- 满意后,点击"保存处理后图像"按钮保存结果
测试建议: 尝试使用不同类型的图像(如风景照、人像、文档扫描等)测试应用,观察各种处理算法在不同图像上的效果。
5. 常见问题与解决方案
5.1 内存管理问题
问题: 处理大图像时应用内存占用过高或崩溃。
解决方案:
- 确保正确释放不再使用的 Mat 对象(使用 Dispose 方法)
- 考虑在加载前调整图像大小
- 对于特别大的图像,可以实现分块处理
5.2 性能优化
问题: 图像处理操作响应缓慢。
解决方案:
- 对于耗时操作,考虑使用异步处理(Task.Run)
- 添加处理进度指示器
- 对于复杂操作,考虑在处理前降低图像分辨率
5.3 OpenCvSharp 依赖问题
问题: 在部署应用时,可能会遇到 DLL 缺失错误。
解决方案:
- 确保安装了所有必要的 NuGet 包,特别是 OpenCvSharp4.Windows
- 考虑使用发布配置中的"包含所有依赖项"选项
- 检查目标平台(x86/x64)设置是否正确
6. 扩展与进阶
6.1 添加更多图像处理功能
你可以通过添加以下功能来扩展应用:
- 图像旋转和翻转:使用
Cv2.Rotate
和Cv2.Flip
方法 - 图像缩放:使用
Cv2.Resize
方法 - 图像裁剪:使用 Mat 的 ROI(感兴趣区域)功能
- 颜色空间转换:除了灰度转换,还可以尝试 HSV、Lab 等颜色空间
- 形态学操作:如腐蚀(Erode)和膨胀(Dilate)
6.2 添加参数调整功能
为了提供更好的用户体验,你可以添加参数调整控件:
- 使用 TrackBar(滑块)控件调整高斯模糊的核大小
- 使用 NumericUpDown 控件调整 Canny 边缘检测的阈值
- 添加 ComboBox 控件选择不同的二值化方法
6.3 批处理功能
对于需要处理多张图像的场景,你可以实现批处理功能:
- 允许用户选择多个文件或整个文件夹
- 为每个图像应用相同的处理操作
- 将结果保存到指定文件夹
6.4 高级计算机视觉功能
如果你想探索更高级的功能,可以考虑:
- 人脸检测:使用
CascadeClassifier
类 - 特征点检测:使用 SIFT、SURF 或 ORB 算法
- 图像分割:使用分水岭算法或 GrabCut 算法
- 对象跟踪:使用 KCF 或 CSRT 跟踪器
7. 总结
在本教程中,我们成功构建了一个基于 WinForms 和 OpenCvSharp 的图像处理应用。我们学习了:
- 如何在 .NET 项目中集成 OpenCvSharp
- 如何设计适合图像处理的用户界面
- 如何实现基本的图像处理功能(灰度转换、高斯模糊、边缘检测、二值化)
- 如何正确管理图像资源,避免内存泄漏
- 如何处理常见问题并进行性能优化
你现在已经掌握了在 WinForms 应用中集成 OpenCvSharp 的基础知识! 你可以在此基础上继续探索更多高级功能,或者将这些知识应用到你自己的项目中。
8. 参考资源
- OpenCvSharp GitHub 仓库
- OpenCV 官方文档
- OpenCvSharp 文档
- 计算机视觉入门教程
9. 练习与挑战
为了巩固所学知识,你可以尝试以下练习:
- 基础练习:添加图像旋转和翻转功能
- 中级练习:实现自适应阈值二值化,并与固定阈值进行比较
- 高级挑战:实现简单的对象检测功能,如人脸或特定形状的检测
相关文章:
WinForms 应用中集成 OpenCvSharp 实现基础图像处理
引言 欢迎关注dotnet研习社,今天我们要讨论的主题是WinForms 应用中集成 OpenCvSharp 实现基础图像处理。 在常规的图像处理软件开发中,图像处理功能是这些应用程序的核心组成部分。无论是简单的照片编辑工具,还是复杂的计算机视觉应用&…...
apache http client连接池实现原理
在java开发中我们经常会涉及到http 请求接口,一般有几种方式: java自带的 HttpURLConnectionokHttpClientapache http client 一般我们使用apache http client会比较多点,在代码中会进行如下调用方式: private static class Htt…...
adb抓包
目录 抓包步骤 步骤 1: 获取应用的包名 步骤 2: 查看单个应用的日志 步骤 3: 使用日志级别过滤器 步骤 4: 高级日志过滤 可能的原因: 解决方案: 额外提示: 日志保存 抓包步骤 连接设备 adb devices 步骤 1: 获取应用的包名 首先…...
C语言---结构体 、联合体、枚举
一、初识结构体 1、结构体类型 结构体和数组都是集合,但是结构体有成员,类型可以不同;数组有成员,类型相同。 int main() {struct tag{member--list //一个或者多个成员,成员变量}variable--list;//可以省略&#x…...
Web Workers 使用指南
文章目录 前言基础使用高级特性 使用 ES Modules实际应用场景图像处理大数据处理轮询任务 性能优化技巧现代开发方式使用 worker-loader (Webpack) Vite中的Worker使用 限制与注意事项DOM限制:通信限制:同源策略:最佳实践 前言 Web Workers 是浏览器提供的 JavaScript 多线程解…...
JVM 与容器化部署调优实践(Docker + K8s)
📌 文章目录 📘 前言1️⃣ 容器环境下 JVM 面临的新挑战2️⃣ JVM 的容器资源感知机制详解3️⃣ JVM 内存调优:如何正确使用堆内存4️⃣ JVM CPU 调优:GC 与编译线程控制5️⃣ Kubernetes 典型配置误区与对策6️⃣ 实战案例&#…...
Android OkHttp控制链:深入理解网络请求的流程管理
OkHttp作为Android和Java平台上广泛使用的HTTP客户端,其核心设计之一就是"控制链"(Chain)机制。本文将深入探讨OkHttp控制链的工作原理、实现细节以及如何利用这一机制进行高级定制。 一、什么是OkHttp控制链 OkHttp控制链是一种责任链模式的实现&#…...
《易经》的数学表达:初级版和高级版
《易经》的数学表达, 一、初级版,可基于以下框架构建, 涵盖符号系统、结构代数及变换规则: 此框架将《易经》抽象为离散数学结构,兼容符号逻辑、概率论与群论,为算法化占断、卦象拓扑分析及跨文化比较提供…...
卷积神经网络基础(十)
之前我们学习了SGD、Momentum和AdaGrad三种优化方法,今天我们将继续学习Adam方法。 6.1.6 Adam 我们知道Momentum参照的是小球在碗中滚动的物理规则进行移动而实现的,AdaGrad为参数的每个元素适当地调整更新步伐。那如果我们将这两种方法融合在一起会不…...
怎么把cursor(Cursor/ollama)安装到指定路径
使用PowerShell命令 打开电脑开始菜单,输入powerShell,使用管理员权限打开powerShell窗口,使用cd命令到cursor或ollama安装包的下载目录,如我的Cursor所在的目录为D:\environment\cursor\soft,输入以下 cd E:\downloa…...
第21天-pyttsx3语音播放功能
示例1:语音参数控制(语速/音量/音调) import pyttsx3def speech_demo():engine = pyttsx3.init()# 获取当前语音参数print("默认语速:", engine.getProperty(rate))print("默认音量:", engine.getProperty(volume))print("可用语音:", engin…...
Multi-Query Attention:传统自注意力( Self-Attention)优化显存和加速方案
本文导读:Multi-Query Attention(MQA)是 Google Research 2022 年提出的一项轻量化注意力技术,通过“多查询、单键值”的设计,把自注意力层的 KV 缓存从 O(hnd) 降到 O(nd),在不牺牲模型精度的前提下大幅节…...
学习路之uniapp--unipush2.0推送功能--服务端推送消息
学习路之uniapp--unipush2.0推送功能--服务端推送消息 一、二、三、 一、 二、 三、...
如何使用AI搭建WordPress网站
人工智能正迅速成为包括网页设计在内的许多行业在其功能设置中添加的一种工具。在数字设计和营销领域,许多成熟的工具都在其产品中添加了人工智能功能。WordPress 也是如此。作为目前最流行的网站建设工具之一,WordPress 的人工智能插件越来越多也就不足…...
Java 项目管理工具:Maven 与 Gradle 的深度对比与选择
Java 项目管理工具:Maven 与 Gradle 的深度对比与选择 在 Java 开发领域,项目管理工具对于项目的构建、依赖管理等起着至关重要的作用。Maven 和 Gradle 是目前最主流的两款工具,它们各自有着独特的优势和适用场景。本文将对 Maven 与 Gradl…...
Elasticsearch简单集成java框架方式。
Elasticsearch 在 Java 中最常用的客户端是什么?如何初始化一个 RestHighLevelClient?如何用 Spring Boot 快速集成 Elasticsearch?Spring Data Elasticsearch 如何定义实体类与索引的映射? 最常用的 Java 客户端 目前官方推荐使用…...
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Hidden Search Widget (交互式搜索框)
📅 我们继续 50 个小项目挑战!—— Hidden Search Widget 组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ ✨ 组件目标 点击按钮展开隐藏的搜索框 再次点击按钮…...
python爬虫和逆向:百度翻译数据采集的几种方式
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、官方API方式(推荐)1.1 百度翻译开放平台API二、网页版逆向方式(代码可直接运行)2.1 拿到js加密方法2.2 python解密代码三、浏览器自动化方式3.1 Selenium自动化操作3.2 Playwright自动化四、移动端API逆向4.1 分…...
spring5-配外部文件-spEL-工厂bean-FactoryBean
spring配外部文件 我们先在Spring里配置一个数据源 1.导c3p0包,这里我们先学一下hibernate持久化框架,以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…...
Ubuntu部署私有Gitlab
这个东西安装其实挺简单的,但是因为我这边迁移了数据目录和使用自己安装的 nginx 代理还是踩了几个坑,所以大家可以注意下 先看下安装 # 先安装必要组件 sudo apt update sudo apt install -y curl openssh-server ca-certificates tzdata perl# 添加gi…...
Activiti 7建表语句及注释
Activiti数据库表Oracle兼容DM建表语句及字段注释。 附件下载版地址点这里 --通用属性表 create table ACT_GE_PROPERTY (NAME_ NVARCHAR2(64),VALUE_ NVARCHAR2(300),REV_ INTEGER,primary key (NAME_) );COMMENT ON TABLE ACT_GE_PROPERTY IS 通用属性表;COMMENT ON COLUMN …...
React中使用 Ant Design Charts 图表
// 引入 Ant Design Charts 的柱状图组件 Column import { Column } from ant-design/charts;// 定义函数组件 App,用于展示柱状图 function App() {// 数据源:每个对象代表一个柱子,包含类型(type)和销售额࿰…...
佰力博科技与您探讨压电材料的原理与压电效应的应用
压电材料的原理基于正压电效应和逆压电效应,即机械能与电能之间的双向转换特性。 压电材料的原理源于其独特的晶体结构和电-机械耦合效应,具体可分为以下核心要点: 1. 正压电效应与逆压电效应的定义 正压电效应:当压电…...
vscode打开vue + element项目
好嘞,我帮你详细整理一个用 VS Code 来可视化开发 Vue Element UI 的完整步骤,让你能舒服地写代码、预览界面、调试和管理项目。 用 VS Code 可视化开发 Vue Element UI 全流程指南 一、准备工作 安装 VS Code 官网下载安装:https://code…...
一步步解析 HTTPS
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
使用vue2做一个生成二维码的案例【可当组件使用】
最近有个需求需要用前端来生成一个二维码,就封装了一个简单的组件,这篇文章来分享给大家。 使用的技术: Vue2 Ant Design Vue QRCodeJS2 node版本:16.20 组件样式: 大家可以根据自己的需求来调整代码。 依赖安装&am…...
Hadoop-HA高可用集群启动nameNode莫名挂掉,排错解决
Hadoop-HA高可用集群启动nameNode莫名挂掉,排错解决 nameNode错误日志 2025-05-21 16:14:12,218 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: node01/192.168.191.111:8485. Already tried 5 time(s); retry policy is RetryUpToMaximumCoun…...
从零基础到最佳实践:Vue.js 系列(2/10):《模板语法与数据绑定》
Vue.js 模板语法与数据绑定:从基础到实践 关键点 Vue.js 的模板语法使用 HTML 结合特殊指令(如 v-bind、v-on),实现动态界面。插值({{ }})显示数据,指令控制 DOM 行为,双向绑定简化…...
第二章:Android常用UI控件
1、介绍: 控件是界面组成的主要元素,界面中的控件有序排放和完美组合,便可在用户眼前呈现出丰富多彩的页面。 2、常用控件: 一、TextView控件: 在使用手机时,经常会看见一些文本信息,这些文本…...
LeetCode 1004. 最大连续1的个数 III
LeetCode 1004题 “最大连续1的个数 III” 是一道关于数组和滑动窗口的问题。题目描述如下: 题目描述 给定一个由若干 0 和 1 组成的数组 nums,以及一个整数 k。你可以将最多 k 个 0 翻转为 1。返回经过翻转操作后,数组中连续 1 的最大个数…...
Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持
引言 Apache Flink 社区很开心地宣布,在经过4个月的版本开发之后,Flink CDC 3.4.0 版本已经正式发布。Flink CDC 是流行的流式数据集成框架,CDC 3.4.0 版本强化了框架对于高频表结构变更的支持,框架支持了 batch 执行模式&#x…...
NIFI的处理器:JSLTTransformJSON 2.4.0
该处理器使用JSLT转换FlowFile JSON有效负载的格式。使用转换后的内容创建新的FlowFile,并将其路由到“成功”关系。如果JSLT转换失败,则将原始FlowFile路由到“失败”关系。 需要注意的是,编译JSLT转换可能相当昂贵。理想情况下,…...
k8s-ServiceAccount 配置
在 Kubernetes 中 ServiceAccount 是一种为 Pod 提供身份认证的机制,允许 Pod 以特定的身份访问 Kubernetes API 服务器。 **Role(角色)**是 Kubernetes 中定义权限的资源对象,它只能在特定的命名空间内生效。Role 用于定义一组权…...
Python Lambda 表达式
在 Python 编程中,Lambda 表达式是一个非常强大且实用的工具,它就像一把瑞士军刀,能在各种场景下帮助我们写出简洁、优雅的代码。接下来,就让我们一起深入探索 Python Lambda 表达式的奥秘。 一、Lambda 表达式的基础认知 1…...
【ffmpeg】ffprobe基本用法
ffprobe 是 FFmpeg 工具集中的一个强大命令行工具,主要用于分析多媒体文件(如视频、音频等)的格式和内容信息。它可以提取文件的元数据、编解码器信息、流详情、帧信息等,而无需对文件进行转码或修改。 基本用法 ffprobe [选项] …...
Java 代码生成工具:如何快速构建项目骨架?
Java 代码生成工具:如何快速构建项目骨架? 在 Java 项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作。幸运的是,Java 领域有许多代码生成工具可以帮助我们快速完成这一任务,大大提高开发效率。 一、代码生…...
模板初阶【C++】
一、 泛型编程 前言: 我们经常会用到数据的交换,C中的函数重载可以完成 //函数重载 void swap(int& x,int& y) {int tmp x;x y;y tmp; }void swap(double& x, double& y) {double tmp x;x y;y tmp; }void swap(char& x, ch…...
URL 类知识点详解
URL 类知识点详解 1. 基本概念与位置 所属包: java.net.URL核心功能: 表示统一资源定位符(Uniform Resource Locator),用于标识和定位网络资源(如网页、文件、API接口)。支持多种协议:HTTP、HTTPS、FTP、file(本地文件)等。不可变类:一旦创建,内容不可修改(线程安全…...
如何使用redis做限流(golang实现小样)
在实际开发中,限流(Rate Limiting)是一种保护服务、避免接口被恶意刷流的常见技术。常用的限流算法有令牌桶、漏桶、固定窗口、滑动窗口等。由于Redis具备高性能和原子性操作,常常被用来实现分布式限流。 下面给出使用Golang结合Redis实现简单限流的几种常见方式(以“固定…...
OpenHarmony外设驱动使用 (九),Pin_auth
OpenHarmony外设驱动使用 (九) Pin_auth 概述 功能简介 口令认证是端侧设备不可或缺的一部分,为设备提供一种用户认证能力,可应用于设备解锁、支付、应用登录等身份认证场景。用户注册口令后,口令认证模块就可为设备…...
MySQL基础(InnoDB)
✅ InnoDB:支持事务、行级锁、外键。 为什么要用事务? 安全:如果中途发现错误(比如改错分数),可以一键撤销所有操作,就像游戏里的“回档”功能! 原子…...
自建srs实时视频服务器支持RTMP推流和拉流
文章目录 一、整体示意图二、服务器端1.srs简介及架构2.docker方式安装3.k8s方式安装4.端口 三、推流端1.OBS Studio2.ffmpeg推流3.streamlabs苹果手机4.twire安卓手机5.网络推流摄像头 四、拉流端1.vlc2.srs 参考awesome系列:https://github.com/juancarlospaco/aw…...
C++性能优化的7大核心策略与实战案例
在大型C项目中,性能优化需从语言特性、系统架构、硬件特性等多维度切入。以下是经过验证的关键技术路径👇 🔧 一、内存管理的极致控制 问题:频繁的动态内存分配会导致性能抖动和内存碎片,尤其在实时系统中可能…...
《国家高等教育智慧平台:重塑学习新时代》
时代之需:平台应运而生 在数字化浪潮席卷全球的当下,高等教育领域也在经历着深刻的变革。数字化技术的迅猛发展,正以前所未有的力量重塑着高等教育的形态。从在线课程的兴起,到虚拟实验室的应用,再到智能化教学工具的普…...
【Django】Django DRF 中如何手动调用分页器返回分页数据(APIView,action场景)
📦 Django DRF 中如何手动调用分页器返回分页数据(APIView,action场景) 在使用 Django REST Framework(DRF)时,很多人习惯了用 GenericAPIView 或 ViewSet 自动帮我们处理分页。但在某些场景中…...
遨游科普:三防平板有哪些品牌?哪个品牌值得推荐?
在工业数字化与户外作业场景日益多元化的今天,三防平板凭借其卓越的防护性能与功能集成能力,成为电力巡检、地质勘探、应急救援等领域不可或缺的智能终端。所谓“三防”,即防尘、防水、防摔,国际标准IP68与军用标准MIL-STD-810H的…...
Flannel后端为UDP模式下,分析数据包的发送方式(一)
Flannel 使用的是 UDP 模式,分析发往 10.244.2.5 的数据包会从哪个网卡发出。 路由表 以下是提供的路由表: Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 …...
华为鸿蒙电脑发布,折叠屏怎么选?
1⃣屏幕特性: 分辨率:高分辨率能保证图像和文字的清晰细腻 屏幕材质:OLED 屏幕通常具有更好的对比度、色彩表现和更广的色域 刷新率:支持自适应刷新率的屏幕可以根据不同的使用场景自动调整刷新率,在保证流畅度的同时优…...
将VMware上的虚拟机和当前电脑上的Wifi网卡处在同一个局域网下,实现同一个局域网下实现共享
什么是桥接模式:桥接模式(Bridging Mode)是一种网络连接模式,常用于虚拟机环境中,将虚拟机的虚拟网络适配器直接连接到主机的物理网络适配器上,使虚拟机能够像独立的物理设备一样直接与物理网络通信 1.打开…...
论文阅读:Auto-Encoding Variational Bayes
对图像生成论文自编码变分贝叶斯Auto-Encoding Variational Bayes原理理解和记录 Abstract 我们如何在有向概率模型中,在具有难以处理的后验分布的连续潜在变量z和大型数据集的存在下,执行有效的推理和学习? 我们介绍了一种随机变分推理和学…...