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

opencv图像卷积操作和常用的图像滤波函数

文章目录

      • opencv图像卷积操作原理,opencv中常用的图像滤波函数
      • 一、图像卷积操作原理:
        • 1、卷积操作原理图:
      • 二、opencv常用的图像滤波函数:这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声,使图像变得更加平滑);
        • 1、cv::blur()函数:英文全拼blur
          • (1)函数原型:
          • (2)代码示例:
        • 2、cv::boxFilter()函数:
          • (1)函数原型:
          • (2)cv.blur() 均值滤波器与cv.boxFilter() 方框滤波器的区别:
            • 核的定义:
            • 参数不同:
            • 功能略有差异:
            • 总结:
          • (3)代码示例:
        • 3、cv::GuassianBlur()函数:
          • (1)函数原型:
          • (2)代码示例:
        • 4、cv::medianBlur()函数:
          • (1)函数原型:
          • (2)代码示例:
        • 5、cv::bilateralFilter()函数:
          • (1)函数原型:
          • (2)代码示例:
        • 6、cv2::filter2D()函数:
          • (1)函数原型:
          • (2)代码示例:

opencv图像卷积操作原理,opencv中常用的图像滤波函数

一、图像卷积操作原理:

卷积是图像处理中常用的操作之一,它通过在图像上滑动一个滤波器(也称为卷积核)来实现对图像的处理,每个滤波器(卷积核)都是一个小的矩阵,它包含一组权重值;

1、卷积操作原理图:
  • 将滤波器(卷积核)与图像的一个小区域相乘;
  • 将得到的乘积相加,得到一个新的像素值;
  • 通过不断滑动滤波器(卷积核),对整幅图像进行处理,从而得到一幅经过卷积操作的图像;
    在这里插入图片描述
    计算过程图:
    在这里插入图片描述

二、opencv常用的图像滤波函数:这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声,使图像变得更加平滑);

1、cv::blur()函数:英文全拼blur

均值滤波器(平均滤波器),用于图像模糊(平滑)处理的函数,它将图像中的每个像素值替换为其周围像素值的平均值,从而实现图像的模糊效果;

(1)函数原型:
void cv::blur(InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT
);参数解释:
src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像;
ksize:卷积核,用cv::Size(width, height)来指定,例如(3,3)表示一个3x3的卷积核,通常使用奇数大小的核;
anchor:锚点,默认为卷积核的中心,默认值Point(-1, -1);
borderType:图像边缘处的像素填充方式(cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
)
(2)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 读取彩色图像cv::Mat image = cv::imread("C:\\cpp\\image\\suzy1.jpg");if (image.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}cv::Mat outputImage;cv::Size kernelSize(5, 5);cv::blur(image, outputImage, kernelSize);cv::imshow("Input Image", image);cv::imshow("Blurred Image", outputImage);cv::waitKey(0);return 0;}

运行结果:
在这里插入图片描述

2、cv::boxFilter()函数:

方框滤波器(均值滤波器的一种变体),方框滤波器与均值滤波器类似,通过计算图像中每个像素周围邻域像素的加权平均值来减少噪声,但相比 cv::blur()cv::boxFilter()可以指定不同的归一化方式;

(1)函数原型:
void cv::boxFilter(cv::InputArray src,cv::OutputArray dst,int ddepth,cv::Size ksize,cv::Point anchor = cv::Point(-1,-1),bool normalize = true,int borderType = cv::BORDER_DEFAULT
);参数解释:
src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像,与输入图像具有相同的尺寸和通道数;
ddepth:输出图像的深度,通常使用-1表示与输入相同;
ksize:卷积核,用cv::Size(width, height)来指定,例如(3,3)表示一个3x3的卷积核,通常使用奇数大小的核;
anchor:锚点,默认为卷积核的中心,默认值Point(-1, -1);
normalize:是否对结果进行归一化,默认为true;
borderType:图像边缘处的像素填充方式(cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
)
(2)cv.blur() 均值滤波器与cv.boxFilter() 方框滤波器的区别:

cv::blur()cv::boxFilter() 都是用于图像平滑处理的滤波器,它们的核心目的是减少图像中的噪声,使图像变得更加平滑;

核的定义:
  • cv::blur() 的核是一个归一化的平均核,也就是说核内所有元素的和为1(这表示在滤波过程中,像素值被取平均值);
  • cv::boxFilter() 的核不一定是归一化的,可以通过 normalize 参数控制是否归一化(这使得方框滤波器可以对像素进行加权平均);
参数不同:
  • cv::blur() 接受一个 cv::Size 参数作为核的大小,通常使用奇数大小的核;
  • cv::boxFilter() 接受一个整数参数作为核的大小,可以使用偶数大小的核;
功能略有差异:
  • 由于 cv::boxFilter() 可以选择是否归一化,因此它可以用于一些特殊情况下的平滑处理,比如图像锐化;
  • cv::blur() 更适合通用的平滑处理;
总结:

总的来说,这两个函数都可以用于图像平滑处理,选择使用哪个取决于你的具体需求以及想要实现的效果,如果你只是需要一个简单的平滑处理,通常使用 cv::blur() 就足够了,如果你需要更多的控制,或者想要尝试一些特殊的滤波效果,可以考虑使用 cv::boxFilter()

(3)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 读取彩色图像cv::Mat image = cv::imread("C:\\cpp\\image\\suzy1.jpg");if (image.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}cv::Mat outputImage;cv::Size kernelSize(5, 5);cv::boxFilter(image, outputImage, -1, kernelSize);cv::imshow("Input Image", image);cv::imshow("Box Filtered Image", outputImage);cv::waitKey(0);return 0;}

运行结果:
在这里插入图片描述

3、cv::GuassianBlur()函数:

高斯滤波器,对输入图像中的每个像素施加一个高斯函数作为权重,从而实现平滑处理,通过应用高斯滤波器来减少图像中的噪声,会较明显地模糊边缘;

(1)函数原型:
void cv::GaussianBlur(cv::InputArray src,  cv::OutputArray dst,  cv::Size ksize,  double sigmaX,  double sigmaY = 0,   int borderType = cv::BORDER_DEFAULT
);参数解释:
src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像,与输入图像具有相同的尺寸和通道数;
ksize:卷积核,用cv::Size(width, height)来指定,例如(3,3)表示一个3x3的卷积核,通常使用奇数大小的核;
sigmaX:X方向的高斯核标准差;
sigmaY:Y方向的高斯核标准差,如果为零则默认与sigmaX相同;
borderType:图像边缘处的像素填充方式(cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
)
(2)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 读取彩色图像cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");if (inputImage.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}cv::Mat outputImage;cv::Size kernelSize(5, 5);double sigmaX = 1.5;cv::GaussianBlur(inputImage, outputImage, kernelSize, sigmaX);cv::imshow("Input Image", inputImage);cv::imshow("Gaussian Blurred Image", outputImage);cv::waitKey(0);return 0;}

运行结果:
在这里插入图片描述

4、cv::medianBlur()函数:

中值滤波器,对输入图像进行平滑处理,通过用邻域像素的中值来替代当前像素的值,从而减少图像中的噪声,是一种常用于去除图像中的椒盐噪声(salt-and-pepper noise)的非线性滤波器;

(1)函数原型:
void cv::medianBlur(cv::InputArray src,         cv::OutputArray dst,        int ksize                   
);参数解释:
src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像,与输入图像具有相同的尺寸和通道数;
ksize:卷积核,通常为奇数,用cv::Size(width, height)来指定,通常使用奇数大小的核;
(2)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 读取彩色图像cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");if (inputImage.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}cv::Mat outputImage;int kernelSize = 5; // 选择一个奇数大小的核cv::medianBlur(inputImage, outputImage, kernelSize);cv::imshow("Input Image", inputImage);cv::imshow("Median Blurred Image", outputImage);cv::waitKey(0);return 0;}

运行结果:
在这里插入图片描述

5、cv::bilateralFilter()函数:

双边滤波器,双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存;

(1)函数原型:
void cv::bilateralFilter(cv::InputArray src,         cv::OutputArray dst,        int d,                      double sigmaColor,          double sigmaSpace,         int borderType = cv::BORDER_DEFAULT  
);参数解释:src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像,与输入图像具有相同的尺寸和通道数;
d:控制在颜色空间中滤波器的直径,通常在3-5之间;
sigmaColor:控制颜色相似性的标准差,值越大,颜色差异越大;
sigmaSpace:控制空间相似性的标准差,值越大,范围内像素权重越大;
borderType:图像边缘处的像素填充方式(cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
)
(2)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 读取彩色图像cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");if (inputImage.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}cv::Mat outputImage;int d = 9; // 直径double sigmaColor = 75; // 颜色相似性标准差double sigmaSpace = 75; // 空间相似性标准差cv::bilateralFilter(inputImage, outputImage, d, sigmaColor, sigmaSpace);cv::imshow("Input Image", inputImage);cv::imshow("Bilateral Filtered Image", outputImage);cv::waitKey(0);return 0;}

运行结果:
在这里插入图片描述

6、cv2::filter2D()函数:

对输入图像进行二维卷积操作,通过将一个核应用于图像的每个像素,从而实现特定的图像处理效果,如边缘检测、模糊等;

(1)函数原型:
void cv::filter2D(cv::InputArray src,       cv::OutputArray dst,  int ddepth,          cv::InputArray kernel,  cv::Point anchor = cv::Point(-1,-1),double delta = 0,   int borderType = cv::BORDER_DEFAULT  
);参数解释:
src:输入图像,可以是单通道或多通道图像(如灰度图或彩色图);
dst:输出图像,与输入图像具有相同的尺寸和通道数;
ddepth:输出图像的深度,通常使用-1表示与输入相同;
kernel:卷积核,用于定义卷积操作的权重矩阵;
anchor:锚点,默认为卷积核的中心,默认值Point(-1, -1);
delta:可选参数,用于调节卷积结果的偏移值,默认为0;
borderType:图像边缘处的像素填充方式(cv::BORDER_CONSTANT:在图像边缘处的像素,用常数填充,这个常数由cv::Scalar()函数指定,默认为黑色;cv::BORDER_REPLICATE:在图像边缘处的像素,用最边界的像素值来填充;cv::BORDER_DEFAULT:根据具体情况选择最合适的边界处理方式,默认值;
)
(2)代码示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 读取彩色图像cv::Mat inputImage = cv::imread("C:\\cpp\\image\\suzy1.jpg");if (inputImage.empty()) {std::cerr << "Error: 无法读取图像文件." << std::endl;return -1;}cv::Mat kernel = (cv::Mat_<float>(3, 3) <<0, -1, 0,-1, 5, -1,0, -1, 0);cv::Mat outputImage;cv::filter2D(inputImage, outputImage, -1, kernel);cv::imshow("Input Image", inputImage);cv::imshow("Filtered Image", outputImage);cv::waitKey(0);return 0;}

运行结果:
在这里插入图片描述

相关文章:

opencv图像卷积操作和常用的图像滤波函数

文章目录 opencv图像卷积操作原理&#xff0c;opencv中常用的图像滤波函数一、图像卷积操作原理&#xff1a;1、卷积操作原理图&#xff1a; 二、opencv常用的图像滤波函数&#xff1a;这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声&#xff0…...

习题1. 31

话不多说 先上代码 (defn product [ term a nxt b](defn iter [a result](if (> a b)1 (* (term a) (iter (nxt a) result))))(iter a 1)) 跟习题1.30比较起来&#xff0c;就是两个地方不同 乘法不能乘0 必须是1。难度来讲&#xff0c;跟1.30难度是一样的。增加了迭代过…...

见微知著:从企业售后技术支持看云计算发展

作者&#xff1a;余凯 售后业务中的细微变化 作为阿里云企业容器技术支持的一员&#xff0c;每天会面对全球各地企业级客户提出的关于容器的各种问题&#xff0c;通过这几年的技术支持的经历&#xff0c;逐步发现容器问题客户的一些惯性&#xff0c;哪些是重度用户&#xff0…...

C++笔记之如何给 `const char*` 类型变量赋值

C笔记之如何给 const char* 类型变量赋值 code review! 文章目录 C笔记之如何给 const char* 类型变量赋值1.在C中&#xff0c;如果你要给一个 const char* 变量赋值&#xff0c;你通常有几种方法来做这件事&#xff0c;具体取决于你的需求。下面是一些常见的方法&#xff1a;…...

9.Linear Maps

线性映射 线性映射是将向量作为输入并产生一些新向量作为输出的转换。 从坐标定义开始(数组)&#xff0c;再到2&#xff0c;3&#xff0c;并展示它们是如何关联的 线性映射的坐标表示最终是矩阵&#xff0c; 1.坐标定义&#xff08;数组&#xff09; 列向量是向量的坐标表示…...

大数据Doris(十):添加BE步骤

文章目录 添加BE步骤 一、使用mysql连接 二、​​​​​​​添加be...

Vue2 +Element UI 表格行合并

如果相邻数据是一致的&#xff0c;则单元格的行合并,指定需要合并的列&#xff0c;下面我是指定合并了分类和类型这两列。 先看效果 Element UI为我们的<el-table>提供了一个属性span-method&#xff1a;合并行或列的计算方法 下面是一个示例: html部分 - 主要是在表上指…...

SuperEdge易学易用系列-一键搭建SuperEdge集群

条件说明&#xff1a; 系统 公网IP 内网IP 服务器所在地 K8S版本 Centos7.9 114.116.101.254 192.168.0.245 北京 v1.22.6 Centos7.9 119.8.1.96 192.168.0.83 香港 v1.22.6 Ubuntu22 94.74.108.152 192.168.0.154 纽约 v1.22.6 1. 开始部署 1.1 两条指令从零搭建一个边缘集…...

农场养殖农产品商城小程序搭建

鸡鸭羊牛鱼养殖用户不少&#xff0c;其规模也有大有小&#xff0c;尤其对一些生态养殖企业&#xff0c;其产品需求度更高&#xff0c;同时他们也有实际的销售需求。 由于具备较为稳定的货源&#xff0c;因此大规模多规格销售属性很足。 通过【雨科】平台搭建农场养殖商城&…...

大语言模型之十七-QA-LoRA

由于基座模型通常需要海量的数据和算力内存&#xff0c;这一巨大的成本往往只有巨头公司会投入&#xff0c;所以一些优秀的大语言模型要么是大公司开源的&#xff0c;要么是背后有大公司身影公司开源的&#xff0c;如何从优秀的开源基座模型针对特定场景fine-tune模型具有广大的…...

UML组件图综合指南:设计清晰、可维护的软件系统

介绍&#xff1a; UML&#xff08;Unified Modeling Language&#xff09;组件图是软件系统设计中的重要工具&#xff0c;用于描绘系统的物理结构和组件之间的关系。在软件工程中&#xff0c;通过创建清晰的组件图&#xff0c;团队能够更好地理解系统的模块化结构和组织关系&a…...

深入浅出ThreadPoolExecutor(一)

文章目录 线程池简诉ThreadPoolExecutor详解ThreadPoolExecutor参数详解创建线程池的工具类Executors 线程池简诉 针对各种池子,比如 连接池:用于管理和重复使用数据库连接&#xff0c;避免频繁创建和销毁数据库连接带来的性能开销。对象池&#xff1a;用于管理和重复使用对象…...

网站的常见攻击与防护方法

在互联网时代&#xff0c;几乎每个网站都存在着潜在的安全威胁。这些威胁可能来自人为失误&#xff0c;也可能源自网络犯罪团伙所发起的复杂攻击。无论攻击的本质如何&#xff0c;网络攻击者的主要动机通常是谋求经济利益。这意味着无论您经营的是电子商务项目还是小型商业网站…...

网络工程师知识点3

41、各个路由协议&#xff0c;在华为设备中的优先级&#xff1f; 直连路由 0 OSPF 10 静态 60 42、OSPF&#xff1a;开放式最短路径优先路由协议&#xff0c;使用SPF算法发现和计算路由 OSPF的优点&#xff1a; 1、收敛速度快&#xff0c;无路由自环&#xff0c;适用于大型网络…...

mongoDB 性能优化

文章目录 前言mongoDB 性能优化1. explain方法来查看查询的执行计划2. 查看mongoDB 集合的索引3. mongoDB 怎么添加索引4. 升序索引与降序索引是什么意思 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易…...

10月13日,每日信息差

今天是2023年10月13日&#xff0c;以下是为您准备的13条信息差 第一、欧盟投资4.5亿欧元在法国建设电池超级工厂。欧洲投资银行是欧盟的贷款机构&#xff0c;也是世界上最大的跨国银行之一 ​第二、北京银行推出数字人民币智能合约平台 数字人民币预付资金管理产品在商超场景…...

Spring Boot 中的 Redis 数据操作配置和使用

Spring Boot 中的 Redis 数据操作配置和使用 Redis&#xff08;Remote Dictionary Server&#xff09;是一种高性能的开源内存数据库&#xff0c;用于缓存、消息队列、会话管理和数据存储。在Spring Boot应用程序中&#xff0c;Redis被广泛用于各种用例&#xff0c;包括缓存、…...

rust宏

宏看起来和函数很像&#xff0c;只不过名称末尾有一个感叹号 ! 。 宏并不产生函数调用&#xff0c;而是展开成源码&#xff0c;并和程序的其余部分一起被编译。 Rust宏和C不同&#xff0c;Rust的宏会展开为抽象语法树&#xff08;AST&#xff0c;abstract syntax tree&#xff…...

性能测试之性能测试指标详解

前言 刚开始&#xff0c;以为做性能测试&#xff0c;就是做些脚本、参数化、关联&#xff0c;压起来之后&#xff0c;再扔出一个结果。 但实际上不止这些内容&#xff0c;还要加上性能分析&#xff0c;关注调优之后响应时间有多大的提升&#xff0c;TPS 有多大的提高&#xf…...

CustomNavBar 自定义导航栏视图

1. 创建偏好设置键 CustomNavBarTitlePreferenceKey.swift import Foundation import SwiftUI//State private var showBackButton: Bool true //State private var title: String "Title" //"" //State private var subtitle: String? "SubTitl…...

M9A智能助手:为《重返未来:1999》玩家解放时间的自动化解决方案

M9A智能助手&#xff1a;为《重返未来&#xff1a;1999》玩家解放时间的自动化解决方案 【免费下载链接】M9A 1999 小助手 项目地址: https://gitcode.com/gh_mirrors/m9/M9A 在当今快节奏的游戏环境中&#xff0c;玩家常常需要在重复性日常任务上投入大量时间&#xff…...

lingbot-depth-pretrain-vitl-14惊艳效果:RGB输入→INFERNO伪彩深度图动态生成演示

lingbot-depth-pretrain-vitl-14惊艳效果&#xff1a;RGB输入→INFERNO伪彩深度图动态生成演示 1. 模型概述 LingBot-Depth (Pretrained ViT-L/14) 是一款基于 DINOv2 ViT-Large/14 编码器的深度估计与补全模型&#xff0c;拥有 321M 参数。该模型采用创新的 Masked Depth Mo…...

Java Web 新冠物资管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 新冠疫情的爆发对全球公共卫生体系提出了严峻挑战&#xff0c;物资管理成为疫情防控中的关键环节。传统物资管理方式依赖人工操作&#xff0c;效率低下且易出错&#xff0c;难以应对突发公共卫生事件中的大规模物资调配需求。为解决这一问题&#xff0c;新冠物资管理系统应…...

42-西门子1200伺服控制5轴程序 程序采用1200系列PLC,项目实现以下功能: (1)

42-西门子1200伺服控制5轴程序 程序采用1200系列PLC&#xff0c;项目实现以下功能&#xff1a; &#xff08;1&#xff09;.三轴机械手联动取放料PTO脉冲定位控制台达B2伺服 &#xff08;2&#xff09;.台达伺服速度模式应用扭矩模式应用实现收放卷 &#xff08;3&#xff09;.…...

SEO_全面介绍SEO从入门到精通的关键知识点

<h2>什么是SEO&#xff1f;</h2> <p>SEO&#xff08;Search Engine Optimization&#xff0c;搜索引擎优化&#xff09;是一套通过优化网站内容和结构&#xff0c;以提高其在搜索引擎结果页面&#xff08;SERP&#xff09;中的自然排名的技术和策略。SEO不仅…...

专利数据挖掘与商业价值转化:开源工具驱动的技术创新与决策变革

专利数据挖掘与商业价值转化&#xff1a;开源工具驱动的技术创新与决策变革 【免费下载链接】patents-public-data Patent analysis using the Google Patents Public Datasets on BigQuery 项目地址: https://gitcode.com/gh_mirrors/pa/patents-public-data 在数字化转…...

OpenClaw备份策略:GLM-4.7-Flash智能管理本地与云端存储

OpenClaw备份策略&#xff1a;GLM-4.7-Flash智能管理本地与云端存储 1. 为什么需要智能备份方案 上周我的移动硬盘突然罢工&#xff0c;导致三个月的项目文档全部丢失。这次惨痛经历让我意识到&#xff1a;传统备份方式已经无法满足现代工作需求。手动备份不仅耗时耗力&#…...

使用现代 Java 技术栈构建企业级 AI 应用

使用现代 Java 技术栈构建企业级 AI 应用 引言 随着人工智能技术的快速发展&#xff0c;企业级 AI 应用的需求也迅速增长。Java 作为一门成熟的企业级编程语言&#xff0c;其生态系统在 AI 应用开发中扮演着重要角色。本文将探讨如何利用 Java 技术栈构建生产级 AI 应用&#x…...

告别手动编译:用Conda在Ubuntu 20.04上一键安装与管理SUMO交通仿真环境

告别手动编译&#xff1a;用Conda在Ubuntu 20.04上一键安装与管理SUMO交通仿真环境 在交通工程和智能驾驶研究领域&#xff0c;SUMO&#xff08;Simulation of Urban MObility&#xff09;作为开源的微观交通仿真工具&#xff0c;正被越来越多的研究者和开发者采用。然而&#…...

Python农业物联网部署突然中断?揭秘土壤传感器数据丢包率超37%的底层时钟漂移根源(附校准代码)

第一章&#xff1a;Python农业物联网部署在现代农业数字化转型中&#xff0c;Python凭借其丰富的物联网生态库&#xff08;如paho-mqtt、Adafruit-IO、RPi.GPIO&#xff09;和轻量级运行特性&#xff0c;成为边缘设备与云平台协同的核心语言。本章聚焦于基于树莓派的土壤温湿度…...