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

《MATLAB实战训练营:从入门到工业级应用》工程实用篇-自动驾驶初体验:车道线检测算法实战(MATLAB2016b版)

《MATLAB实战训练营:从入门到工业级应用》工程实用篇-🚗 自动驾驶初体验:车道线检测算法实战(MATLAB2016b版)

大家好!今天我要带大家一起探索自动驾驶中一个非常基础但又至关重要的技术——车道线检测。我们将从零开始,一步步用MATLAB2016b实现一个完整的车道线检测系统。准备好你的MATLAB,让我们开始这场有趣的自动驾驶之旅吧!✨

一、准备工作与环境搭建

1.1 为什么选择MATLAB2016b?

MATLAB在图像处理和计算机视觉领域有着强大的功能,而2016b版本稳定且兼容性好,适合教学和实验。当然,如果你有更新的版本也完全没问题!

1.2 需要安装的工具箱

确保你已经安装了以下工具箱(可以通过ver命令查看):

  • Image Processing Toolbox
  • Computer Vision System Toolbox
    在这里插入图片描述

如果没有安装,可以通过MATLAB的"附加功能"菜单进行安装。

1.3 测试数据准备

我们将使用一段高速公路行车视频作为测试数据。你可以使用自己的行车记录仪视频,或者自己从网上下载一个视频:

高速公路驾驶highway_lane

二、车道线检测基础理论

2.1 车道线检测的基本流程

一个典型的车道线检测流程包括以下几个步骤:

  1. 图像获取 📷
  2. 预处理(去噪、增强等) 🛠️
  3. 边缘检测 ✂️
  4. 感兴趣区域(ROI)提取 🔍
  5. 霍夫变换检测直线 📐
  6. 车道线拟合与可视化 🚦

2.2 为什么选择霍夫变换?

霍夫变换是检测图像中几何形状(如直线、圆等)的经典算法。它能够将图像空间中的像素点映射到参数空间,通过累加器找出最可能的几何形状参数。

三、实战开始!一步步实现车道线检测

3.1 读取并显示视频

首先,我们需要读取视频并显示第一帧,看看我们的"战场"是什么样子:

% 创建视频读取对象
videoReader = VideoReader('highway_lane.mp4');% 读取第一帧
frame = readFrame(videoReader);% 显示原始图像
figure('Name', '原始视频帧');
imshow(frame);
title('原始视频帧');

在这里插入图片描述

3.2 图像预处理

原始图像包含太多干扰信息,我们需要进行预处理:

% 转换为灰度图像
grayFrame = rgb2gray(frame);% 高斯滤波去噪
filteredFrame = imgaussfilt(grayFrame, 2);% 显示预处理结果
figure('Name', '预处理结果');
subplot(1,2,1); imshow(grayFrame); title('灰度图像');
subplot(1,2,2); imshow(filteredFrame); title('高斯滤波后');

在这里插入图片描述

3.3 边缘检测

边缘检测是车道线检测的关键步骤,我们使用Canny算法:

% Canny边缘检测
edgeThreshold = [0.1, 0.2]; % 阈值可以调整
sigma = 1; % 高斯滤波参数
edges = edge(filteredFrame, 'Canny', edgeThreshold, 'both', sigma);% 显示边缘检测结果
figure('Name', '边缘检测结果');
imshow(edges);
title('Canny边缘检测结果');

小技巧:阈值的选择很重要,太低会检测到太多噪声,太高可能会漏掉真实的车道线。可以尝试调整看看效果变化!
在这里插入图片描述

3.4 感兴趣区域(ROI)提取

我们不需要分析整个图像,只需要关注车辆前方的道路区域:

% 获取图像尺寸
[rows, cols] = size(edges);% 定义ROI多边形顶点(梯形区域)
roi = [1, rows; cols/2-50, rows/2+50; cols/2+50, rows/2+50; cols, rows];% 创建ROI掩模
roiMask = poly2mask(roi(:,1), roi(:,2), rows, cols);% 应用ROI掩模
roiEdges = edges & roiMask;% 显示ROI提取结果
figure('Name', 'ROI提取');
subplot(1,2,1); imshow(edges); hold on; 
plot(roi(:,1), roi(:,2), 'r-', 'LineWidth', 2); 
title('原始边缘+ROI区域');
subplot(1,2,2); imshow(roiEdges); 
title('ROI内边缘');

在这里插入图片描述

3.5 霍夫变换检测直线

现在是重头戏——使用霍夫变换检测直线:

% 霍夫变换参数设置
thetaResolution = 0.5; % 角度分辨率
rhoResolution = 1; % 距离分辨率
threshold = 50; % 累加器阈值
minLineLength = 30; % 最小线段长度
maxLineGap = 20; % 线段间最大间隔% 执行霍夫变换
[H, theta, rho] = hough(roiEdges, 'Theta', -90:thetaResolution:89, 'RhoResolution', rhoResolution);% 检测峰值
peaks = houghpeaks(H, 10, 'Threshold', threshold);% 检测线段
lines = houghlines(roiEdges, theta, rho, peaks, 'FillGap', maxLineGap, 'MinLength', minLineLength);% 显示霍夫变换结果
figure('Name', '霍夫变换检测结果');
imshow(frame); hold on;
for k = 1:length(lines)xy = [lines(k).point1; lines(k).point2];plot(xy(:,1), xy(:,2), 'LineWidth', 2, 'Color', 'green');
end
title('霍夫变换检测到的直线');

在这里插入图片描述

3.6 车道线筛选与拟合

不是所有检测到的直线都是车道线,我们需要筛选:

% 筛选左右车道线
leftLines = [];
rightLines = [];for k = 1:length(lines)% 计算线段斜率x1 = lines(k).point1(1);y1 = lines(k).point1(2);x2 = lines(k).point2(1);y2 = lines(k).point2(2);slope = (y2 - y1) / (x2 - x1);% 根据斜率筛选if slope < -0.3  % 左车道线通常有负斜率leftLines = [leftLines; [x1, y1; x2, y2]]; % 往后追加elseif slope > 0.3  % 右车道线通常有正斜率rightLines = [rightLines; [x1, y1; x2, y2]]; % 往后追加end
end% 拟合左右车道线(使用最小二乘法)
if ~isempty(leftLines)leftPoints = [leftLines(1:2,:); leftLines(3:4,:)];leftPoly = polyfit(leftPoints(:,2), leftPoints(:,1), 1);
endif ~isempty(rightLines)rightPoints = [rightLines(1:2,:); rightLines(3:4,:)];rightPoly = polyfit(rightPoints(:,2), rightPoints(:,1), 1);
end% 显示最终结果
figure('Name', '最终车道线检测结果');
imshow(frame); hold on;% 绘制左车道线
if exist('leftPoly', 'var')yLeft = [rows/2+50, rows];xLeft = polyval(leftPoly, yLeft);plot(xLeft, yLeft, 'LineWidth', 4, 'Color', 'red');
end% 绘制右车道线
if exist('rightPoly', 'var')yRight = [rows/2+50, rows];xRight = polyval(rightPoly, yRight);plot(xRight, yRight, 'LineWidth', 4, 'Color', 'blue');
endtitle('最终车道线检测结果');
legend('左车道线', '右车道线');

在这里插入图片描述

四、完整视频处理与优化

4.1 封装为函数

让我们把上面的代码封装成一个函数,方便处理视频的每一帧:

function [leftLine, rightLine] = detectLanes(frame)% 转换为灰度图像grayFrame = rgb2gray(frame);% 高斯滤波filteredFrame = imgaussfilt(grayFrame, 2);% 边缘检测edgeThreshold = [0.1, 0.2];sigma = 1;
%     edges = edge(filteredFrame, 'Canny', edgeThreshold, 'both', sigma);edges = edge(filteredFrame, 'Canny', edgeThreshold, 'both');% ROI提取[rows, cols] = size(edges);roi = [1, rows; cols/2-50, rows/2+50; cols/2+50, rows/2+50; cols, rows];roiMask = poly2mask(roi(:,1), roi(:,2), rows, cols);roiEdges = edges & roiMask;% 霍夫变换thetaResolution = 0.5;rhoResolution = 1;threshold = 50;minLineLength = 30;maxLineGap = 20;[H, theta, rho] = hough(roiEdges, 'Theta', -90:thetaResolution:89, 'RhoResolution', rhoResolution);peaks = houghpeaks(H, 10, 'Threshold', threshold);lines = houghlines(roiEdges, theta, rho, peaks, 'FillGap', maxLineGap, 'MinLength', minLineLength);% 筛选和拟合车道线leftLines = [];rightLines = [];for k = 1:length(lines)x1 = lines(k).point1(1);y1 = lines(k).point1(2);x2 = lines(k).point2(1);y2 = lines(k).point2(2);slope = (y2 - y1) / (x2 - x1);if slope < -0.3leftLines = [leftLines; [x1, y1; x2, y2]];elseif slope > 0.3rightLines = [rightLines; [x1, y1; x2, y2]];endend% 返回拟合结果leftLine = [];rightLine = [];if ~isempty(leftLines)  & length(leftLines)>4leftPoints = [leftLines(1:2,:); leftLines(3:4,:)];leftLine = polyfit(leftPoints(:,2), leftPoints(:,1), 1);endif ~isempty(rightLines)   & length(rightLines)>4rightPoints = [rightLines(1:2,:); rightLines(3:4,:)];rightLine = polyfit(rightPoints(:,2), rightPoints(:,1), 1);end
end

4.2 处理整个视频

现在我们可以处理整个视频了:

clc
close all
% 创建视频读取和写入对象
videoReader = VideoReader('highway_lane.mp4');
videoWriter = VideoWriter('lane_detection_result.avi');
open(videoWriter);% 创建显示窗口
figure('Name', '实时车道线检测', 'Position', [100, 100, 800, 600]);while hasFrame(videoReader)% 读取当前帧frame = readFrame(videoReader);% 检测车道线[leftLine, rightLine] = detectLanes(frame);% 显示结果imshow(frame); hold on;% 绘制左车道线if ~isempty(leftLine)yLeft = [size(frame,1)/2+50, size(frame,1)];xLeft = polyval(leftLine, yLeft);plot(xLeft, yLeft, 'LineWidth', 4, 'Color', 'red');end% 绘制右车道线if ~isempty(rightLine)yRight = [size(frame,1)/2+50, size(frame,1)];xRight = polyval(rightLine, yRight);plot(xRight, yRight, 'LineWidth', 4, 'Color', 'blue');endtitle('实时车道线检测');drawnow;% 写入视频frameWithLanes = getframe(gcf);writeVideo(videoWriter, frameWithLanes.cdata);hold off;
end% 关闭视频写入器
close(videoWriter);
disp('视频处理完成');

在这里插入图片描述

五、进阶优化与挑战

5.1 优化建议

我们的基础版本已经可以工作了,但还有很大优化空间:

  1. 动态ROI调整:根据车辆速度调整ROI区域大小
  2. 颜色信息利用:结合车道线颜色(黄、白)增强检测
  3. 卡尔曼滤波:平滑车道线检测结果,减少抖动
  4. 曲线车道检测:使用二次或三次多项式拟合曲线车道

5.2 常见问题与解决方案

问题1:在强光下检测效果差

  • 解决方案:使用自适应直方图均衡化(CLAHE)增强对比度
% 替换灰度转换和高斯滤波部分
labFrame = rgb2lab(frame);
L = labFrame(:,:,1)/100;
L = adapthisteq(L);
labFrame(:,:,1) = L*100;
enhancedFrame = lab2rgb(labFrame);
grayFrame = rgb2gray(enhancedFrame);

问题2:检测到非车道线的边缘

  • 解决方案:增加后处理步骤,如基于车道线几何约束的筛选

六、总结与展望

恭喜你!🎉 我们已经完成了一个完整的车道线检测系统。虽然它看起来简单,但这是自动驾驶的基础模块之一。通过这个项目,我们学习了:

  1. 图像预处理技术
  2. 边缘检测算法
  3. 霍夫变换原理与应用
  4. 车道线拟合方法

未来你可以尝试:

  • 实现更复杂的车道线检测算法
  • 集成到更大的自动驾驶系统中
  • 尝试使用深度学习的方法(如LaneNet)

希望这篇教程对你有所帮助!如果有任何问题或建议,欢迎在评论区留言讨论。Happy coding! 💻🚀


附录:完整代码下载
点击这里下载完整MATLAB代码包

参考文献

  1. MATLAB官方文档
  2. 《计算机视觉:算法与应用》Richard Szeliski
  3. 《自动驾驶中的计算机视觉》系列论文

相关文章:

《MATLAB实战训练营:从入门到工业级应用》工程实用篇-自动驾驶初体验:车道线检测算法实战(MATLAB2016b版)

《MATLAB实战训练营&#xff1a;从入门到工业级应用》工程实用篇-&#x1f697; 自动驾驶初体验&#xff1a;车道线检测算法实战&#xff08;MATLAB2016b版&#xff09; 大家好&#xff01;今天我要带大家一起探索自动驾驶中一个非常基础但又至关重要的技术——车道线检测。我…...

【网络】什么是串口链路(Serial Link)?

在路由器上&#xff0c;串口链路&#xff08;Serial Link&#xff09;就是指路由器之间通过串行接口&#xff08;serial interface&#xff09;和串行电缆&#xff08;通常是V.35、RS-232或同步串行线路&#xff09;直接点对点相连的那一段连线。它和我们平常在局域网里用的以太…...

为了结合后端而学习前端的学习日志——【黑洞光标特效】

前端设计专栏 今天给大家带来一个超酷的前端特效——黑洞光标&#xff01;让你的鼠标变成一个会吞噬光粒子的迷你黑洞&#xff0c;点击时还会喷射出绿色能量粒子&#xff01;&#x1f320; &#x1f680; 效果预览 想象一下&#xff1a;你的鼠标变成一个旋转的黑洞&#xff0…...

set autotrace报错

报错&#xff1a; SQL> set autotrace traceonly SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled SP2-0611: Error enabling STATISTICS report原因分析&#xff1a; 根据上面的错误提示“SP2-0618: Cannot find the Session Identifie…...

算法每日一题 | 入门-顺序结构-大象喝水

大象喝水 题目描述 一只大象口渴了&#xff0c;要喝 20 升水才能解渴&#xff0c;但现在只有一个深 h 厘米&#xff0c;底面半径为 r 厘米的小圆桶 &#xff08;h 和 r 都是整数&#xff09;。问大象至少要喝多少桶水才会解渴。 这里我们近似地取圆周率 π 3.14 \pi3.14 π…...

n8n 构建一个 ReAct AI Agent 示例

n8n 构建一个 ReAct AI Agent 示例 0. 引言1. 详细步骤创建一个 "When Executed by Another Workflow"创建一个 "Edit Fields (Set)"再创建一个 "Edit Fields (Set)"创建一个 HTTP Request创建一个 If 节点在 true 分支创建一个 "Edit Fiel…...

Scartch038(四季变换)

知识回顾 1.了解和简单使用音乐和视频侦测模块 2.使用克隆体做出波纹特效 3.取色器妙用侦测背景颜色 前言 我国幅员辽阔,不同地方的四季会有不同的美丽景色,这节课我带你使用程序做一个体现北方四季变化的程序 之前的程序基本都是好玩的,这节课做一个能够赏心悦目的程序。…...

【Linux】SELinux 的基本操作与防火墙的管理

目录 一、SELinux的管理 1.1 Linux 系统的安全机制 1.2 SELinux 的概述 1.3 SELinux 的配置 1.3.1 查看 SELinux 的工作方式 1.3.2 设置 SELinux 的工作方式 1.3.2.1 基于配置文件修改&#xff08;推荐方式&#xff09; 1.3.2.2 基于命令方式修改 二、防火墙管理 2.1 防…...

【React Hooks原理 - useCallback、useMemo】

useMemo用于缓存计算结果&#xff0c;它只在依赖项发生变化时重新计算 原理&#xff1a; 依赖项检查&#xff1a;useMemo接收2个参数&#xff0c;一个“创建”函数和一个依赖项数组。依赖项数组中的值在每次渲染时都会被比较&#xff0c;以决定是否需要重新计算 缓存机制&am…...

一格一格“翻地毯”找单词——用深度优先搜索搞定单词搜索

一格一格“翻地毯”找单词——用深度优先搜索搞定单词搜索 一、引子&#xff1a;别看题简单&#xff0c;实则套路深 说起“单词搜索”这个题目&#xff0c;初学者第一眼可能会说&#xff1a;“哦不就是个查字母吗&#xff1f;”其实&#xff0c;真没这么简单。 LeetCode 上那…...

深入了解 OpenIddict:实现 OAuth 2.0 和 OpenID Connect 协议的 .NET 库

在现代 Web 开发中&#xff0c;身份验证和授权是安全性的重要组成部分。随着对安全性的要求不断增加&#xff0c;OAuth 2.0 和 OpenID Connect&#xff08;OIDC&#xff09;协议已经成为许多应用程序的标准身份验证方式。而 OpenIddict&#xff0c;作为一个用于实现 OAuth 2.0 …...

学习黑客 TCP/IP

一句话总结&#xff1a;把 TCP/IP 看成大型多人在线游戏的“世界引擎”&#xff1a;链路层是地基&#xff0c;互联网层是道路&#xff0c;运输层是交通系统&#xff0c;应用层是景点与商店&#xff1b;协议们则是各种交通工具与技能&#xff08;TCP 稳重的长途客车&#xff0c…...

【沐风老师】3DMAX按元素UV修改器插件教程

3DMAX按元素UV修改器UV By Element是一个脚本化的修改器插件。对于需要创建随机化纹理效果的用户而言&#xff0c;3DMAX的UV By Element修改器无疑是一款高效工具&#xff0c;它将以伪随机量偏移、旋转和/或缩放每个元素的UV坐标。 【版本要求】 3dMax 2016及以上 【安装方法】…...

Jetpack Compose 边距终极指南:Margin 和 Padding 的正确处理方式

Jetpack Compose 边距终极指南&#xff1a;Margin 和 Padding 的正确处理方式 在 Android 开发中&#xff0c;Jetpack Compose 彻底改变了 UI 构建方式&#xff0c;但许多开发者对如何处理边距&#xff08;Margin/Padding&#xff09;感到困惑。本文将深入解析 Compose 的边距…...

Go语言--语法基础4--基本数据类型--类型转换

Go 是一种强类型的语言&#xff0c;所以如果在赋值的时候两边类型不一致会报错。一个类型的值可以被转换成另一种类型的值。由于 Go 语言不存在隐式类型转换&#xff0c;因此所有的类型转换都必须显式的声明。 强制类型转换语法 使用 type (a) 这种形式来进行强制类型转换&am…...

【C++ Qt】输入类控件(上) LineEdit、QTextEdit

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本次分享聚焦 Qt 框架里常用的输入框组件&#xff0c;重点讲解 QLineEdit&#xff08;单行输入框&#xff09;和 QTextEdit&#xff08;多行输入框&…...

【c++深入系列】:万字详解vector(附模拟实现的vector源码)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 种子破土时从不问‘会不会有光’&#xff0c;它只管生长 ★★★ 本文前置知识&#xff1a; 模版 1.什么是vector 那么想必大家都学过顺…...

OpenHarmony平台驱动开发(二),CLOCK

OpenHarmony平台驱动开发&#xff08;二&#xff09; CLOCK 概述 功能简介 CLOCK&#xff0c;时钟是系统各个部件运行的基础&#xff0c;以CPU时钟举例&#xff0c;CPU 时钟是指 CPU 内部的时钟发生器&#xff0c;它以频率的形式工作&#xff0c;用来同步和控制 CPU 内部的各…...

Java大厂面试:Java技术栈中的核心知识点

Java技术栈中的核心知识点 第一轮提问&#xff1a;基础概念与原理 技术总监&#xff1a;郑薪苦&#xff0c;你对JVM内存模型了解多少&#xff1f;能简单说说吗&#xff1f;郑薪苦&#xff1a;嗯……我记得JVM有堆、栈、方法区这些区域&#xff0c;堆是存放对象的地方&#xf…...

硬件加速模式Chrome(Edge)闪屏

Chrome开启“硬件加速模式”后&#xff0c;打开浏览器会闪屏或看视频会闪屏&#xff0c;如果电脑只有集显&#xff0c;直接将这个硬件加速关了吧&#xff0c;没啥必要开着 解决方法 让浏览器使用独立显卡 在Windows左下角搜索 图形设置 &#xff0c;将浏览器添加进去&#…...

【ArcGIS微课1000例】0145:如何按照自定义形状裁剪数据框?

文章目录 一、添加数据二、绘制形状三、裁剪格网和经纬网一、添加数据 打开软件,添加配套实验数据包中0145.rar中的影像数据,如下图所示: 二、绘制形状 1. 在数据视图中,使用绘图 工具条上的新建圆工具 可创建一个椭圆,使其包含要在该数据框中显示的数据范围。 修改椭圆…...

深入了解Linux系统—— 环境变量

命令行参数 我们知道&#xff0c;我们使用的指令它本质上也是一个程序&#xff0c;我们要执行这个指令&#xff0c;输入指令名然后回车即可执行&#xff1b;但是对于指令带选项&#xff0c;又是如何实现的呢&#xff1f; 问题&#xff1a;main函数有没有参数&#xff1f; 在我…...

软考-软件设计师中级备考 12、软件工程

一、软件工程概述 定义&#xff1a;软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量软件的学科。它涉及到软件的开发、测试、维护、管理等多个方面&#xff0c;旨在运用一系列科学方法和技术手段&#xff0c;提高软件的质量和开发效率&#xff0c;降低软件开…...

FreeSwitch Windows安装

下载 FreeSwitch 官网下载地址https://files.freeswitch.org/windows/ 根据自己的系统选择不同的版本&#xff0c;如下图 官网下载可能比较慢&#xff0c;请使用下方下载 FreeSWITCH-1.10.12-Release-x64.msi https://download.csdn.net/download/a670941001/90752912 2、…...

南京优质的公司有哪些?

南京有许多优质的公司&#xff0c;以下是一些有代表性的&#xff1a; 制造业 • 南京钢铁集团有限公司 &#xff1a;作为国家战略布局的 18 家重点钢企之一&#xff0c;是中国特大型钢铁联合企业&#xff0c;1993 年 12 月进行公司制改革&#xff0c;2010 年 9 月实现整体上市…...

Spring AI 实战:第十一章、Spring AI Agent之知行合一

引言:智能体的知行辩证法 “知为行之始,行为知之成”,王阳明的哲学智慧在AI时代焕发光彩。智能体(LLM Agent)的进化之路,正是"认知-决策-执行"这一闭环的完美诠释: 知明理:融合大语言模型的推理能力与知识图谱的结构化认知行致用:基于ReAct模式的动态工具调…...

LeetCode 1128 等价多米诺骨牌对的数量 题解

今天的每日一题&#xff0c;我的思路还是硬做&#xff0c;不如评论区通过状压写的简单&#xff0c;但是答题思路加算法实现是没有问题的&#xff0c;且时间复杂度也是可以通过的&#xff0c;毕竟全是o(n) 那么我就来说一下我的思路&#xff0c;根据dominoes[i] [a, b] 与 domi…...

管理配置信息和敏感信息

管理配置信息和敏感信息 文章目录 管理配置信息和敏感信息[toc]一、什么是ConfigMap和Secret二、使用ConfigMap为Tomcat提供配置文件三、使用Secret为MongDB提供配置文件 一、什么是ConfigMap和Secret 在 Kubernetes 中&#xff0c;ConfigMap 和 Secret 是两种用于管理配置数据…...

Rust与C/C++互操作实战指南

目录 1.前言2.动态库调用2.1 动态加载2.2 静态加载3.代码调用4.静态库调用1.前言 本文原文为:Rust与C/C++互操作实战指南 由于rust诞生时间太短,目前生态不够完善,因此大量的功能库都需要依赖于C、C++语言的历史积累。 而本文将要介绍的便是如何实现rust与c乃至c++之间实…...

word批量转pdf工具

word批量转pdf工具 图片 说到了办公&#xff0c;怎能不提PDF转换哦&#xff1f; 这是一款一键就可以批量word转换为PDF的小工具&#xff0c;简直是VB界的一股清流。 图片 操作简单到不行&#xff0c;只要把需要转换的word文件和这个工具放在同一个文件夹里&#xff0c;双击…...

【数据结构】励志大厂版·初阶(复习+刷题)排序

前引&#xff1a;本篇作为初阶结尾的最后一篇—排序&#xff0c;将先介绍八种常用的排序方法&#xff0c;然后开始刷题&#xff0c;小编会详细注释每句代码的作用&#xff0c;不会出现看不懂的情况&#xff0c;这点大家放心&#xff0c;既是写给大家同时也是写给自己的&#xf…...

Git推送大文件导致提交回退的完整解决记录

问题背景 在向Gitee推送代码时&#xff0c;因单文件超过平台限制&#xff08;100MB&#xff09;&#xff0c;推送被拒绝&#xff1a; > git push origin master:master remote: File [6322bc3f1becedcade87b5d1ea7fddbdd95e6959] size 178.312MB, exceeds quota 100MB rem…...

游戏引擎学习第257天:处理一些 Win32 相关的问题

设定今天的工作计划 今天我们本来是打算继续开发性能分析器&#xff08;Profiler&#xff09;&#xff0c;但在此之前&#xff0c;我们认为有一些问题应该先清理一下。虽然这类事情不是我们最关心的核心内容&#xff0c;但我们觉得现在是时候处理一下了&#xff0c;特别是为了…...

高性能数据库架构探索:OceanBase 分布式技术深入解析

高性能数据库架构探索&#xff1a;OceanBase 分布式技术深入解析 简介 OceanBase 高性能分布式数据库&#xff0c;解决传统数据库在大规模、高并发场景下的性能瓶颈&#xff0c;通过分布式架构、数据自动分片和强一致性协议&#xff0c;提供高可用性、弹性扩展和出色的性能&am…...

【CISCO】Se2/0, Se3/0:串行口(Serial) 这里串口的2/0 和 3/0分别都是什么?

在 Cisco IOS 设备上&#xff0c;接口名称通常遵循这样一个格式&#xff1a; <类型><槽号>/<端口号>类型&#xff08;Type&#xff09;&#xff1a;表示接口的物理或逻辑类型&#xff0c;比如 Serial&#xff08;串行&#xff09;、FastEthernet、GigabitEt…...

GPU集群训练经验评估框架:运营经理经验分析篇

引言 随着深度学习模型规模的持续增长和复杂度的不断提高,单GPU训练已经难以满足现代AI研究和应用的需求。GPU集群训练作为一种有效的扩展方案,能够显著提升训练效率、处理更大规模的数据集和模型。然而,GPU集群训练涉及到分布式训练框架、集群管理工具、性能优化等多个技术…...

函数多项式拟合

函数多项式拟合 用处 不方便使用math时&#xff0c;可以使用多项式拟合法实现比较高效的数学函数&#xff0c;比如使用avx指令时&#xff0c;O3优化&#xff0c;math中的函数会调用FPU指令集&#xff0c;在指令集切换的过程中代码效率大幅降低&#xff0c;为避免使用math中的…...

【Hive入门】Hive与Spark SQL集成:混合计算实践指南

目录 引言 1 Hive与Spark SQL概述 1.1 Hive简介 1.2 Spark SQL简介 2 Hive与Spark SQL集成架构 2.1 集成原理 2.2 配置集成环境 3 混合计算使用场景 3.1 场景一&#xff1a;Hive表与Spark DataFrame互操作 3.2 场景二&#xff1a;Hive UDF与Spark SQL结合使用 3.3 场…...

TFQMR和BiCGStab方法比较

TFQMR&#xff08;Transpose-Free Quasi-Minimal Residual&#xff09;和BiCGStab&#xff08;Bi-Conjugate Gradient Stabilized&#xff09;都是用于求解非对称线性方程组的迭代方法&#xff0c;属于Krylov子空间方法的范畴。它们分别是BiCG&#xff08;双共轭梯度法&#xf…...

小程序 IView WeappUI组件库(简单增删改查)

IView Weapp 微信小程序UI组件库&#xff1a;https://weapp.iviewui.com/components/card IView Weapp.png 快速上手搭建 快速上手.png iView Weapp 的代码 将源代码下载下来&#xff0c;然后将dict放到自己的项目中去。 iView Weapp 的代码.png 小程序中添加iView Weapp 将di…...

nginx 核心功能 02

目录 1. 正向代理 1.1 编译安装 Nginx 1.2 配置正向代理 2. 反向代理 2.1 配置nginx七层代理 2.2 配置nginx四层代理 3. Nginx 缓存 3.1 缓存功能的核心原理和缓存类型 3.2 代理缓存功能设置 4. Nginx rewrite 和正则 4.1 Nginx正则 4.2 nginx location 4.3 Rewri…...

LeetCode 102题解 | 二叉树的层序遍历

二叉树的层序遍历 一、题目链接二、题目三、算法原理四、编写代码 一、题目链接 二叉树的层序遍历 二、题目 三、算法原理 本题要求把结果放在不规则的二维数组里&#xff0c;即每一层二叉树的数值放在一行数组中。 回顾之前的层序遍历是借助队列实现的&#xff0c;是不考虑…...

Flink基础整理

文章目录 前言1.Flink系统架构2.编程模型(API层次结构)3.DataSet和DataStream区别4.Flink的批流统一5.Flink的状态后端6.Flink有哪些状态类型7.Flink并行度前言 提示:下面是根据网络或AI整理: 1.Flink系统架构 用户在客户端提交作业(Job)到服务端。服务端为分布式的主从…...

C++23 新特性:为 std::pair 的转发构造函数添加默认实参

文章目录 1\. 背景&#xff1a;std::pair 的转发构造函数2\. C23 的改进&#xff1a;添加默认实参示例代码 3\. 带来的好处3.1 更简洁的代码3.2 提高代码的可维护性3.3 与 std::optional 和 std::variant 的协同 4\. 实现细节示例实现&#xff08;简化版&#xff09; 5\. 使用场…...

JavaScript性能优化实战(9):图像与媒体资源优化

引言 在当今视觉驱动的网络环境中,图像和媒体资源往往占据了网页总下载量的60%-80%,因此对图像和媒体资源进行有效优化已成为前端性能提升的关键领域。尽管网络带宽持续提升,但用户对加载速度的期望也在不断提高,特别是在移动设备和网络条件不稳定的场景下。 本文作为Jav…...

施磊老师rpc(四)

文章目录 rpc网络服务简介RpcProvider 的设计目标Eventloop不使用智能指针-弃用RpcProvider类似于集群的服务器provider网络实现**src/include/rpcprovider.h****src/include/mprpcapplication.h****src/rpcprovider.cc** 错误1错误2-重点**本项目的 mprpc 是动态库, muduo..是…...

Java学习手册:MyBatis 框架作用详解

一、MyBatis 简介 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。它通过将 Java 对象与数据库表之间的映射关系进行配置&#xff0c;使得开发者可以使用简单的 SQL 语句和 Java 代码来完成复杂的数据操作。MyBatis 支持自定义 SQL 语句&#xff0c;提供了灵…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.1 数据质量评估指标(完整性/一致性/准确性)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 数据质量评估核心指标&#xff1a;完整性、一致性、准确性实战解析3.1 数据质量评估指标体系3.1.1 完整性&#xff1a;数据是否存在缺失1.1.1 核心定义与业务影响1.1.2 检测…...

分布式系统中的 ActiveMQ:异步解耦与流量削峰(一)

一、引言 在当今数字化时代&#xff0c;分布式系统已成为构建大规模应用的关键架构。随着业务的快速发展和用户量的急剧增长&#xff0c;分布式系统面临着诸多挑战&#xff0c;其中异步通信、系统解耦和流量削峰是亟待解决的重要问题。 以电商系统为例&#xff0c;在秒杀活动中…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】2.5 事务与锁机制(ACID特性/事务控制语句)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL 事务与锁机制深度解析:ACID 特性与事务控制全流程2.5 事务与锁机制2.5.1 ACID 特性与实现原理2.5.1.1 ACID 核心概念2.5.1.2 MVCC(多版本并发控制)与WAL(预写式日志)协同效应2.5.2 事务…...