news 2026/10/2 3:49:19

视频运动检测工具DVR-Scan:用MOG2背景减除从监控录像中提取有效片段

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
视频运动检测工具DVR-Scan:用MOG2背景减除从监控录像中提取有效片段

简介:DVR-Scan视频运动检测工具.zip是一份面向计算机视觉学习者、毕业设计开发者及安防监控、交通管理等场景工程人员的资源包,用于对视频文件中的运动事件进行智能识别、标注与记录,核心依托OpenCV、机器学习与图像识别技术。压缩包共112个文件,约15.21MB,主体包含34个Python源码文件、jpg/png/svg图像资源、html/md文档以及cfg/yml/toml配置文件,同时提供Dockerfile与requirements.txt,支持容器化部署和依赖管理。内容上兼顾代码实现、文档说明与环境配置,setup.py和pyproject.toml体现了标准化Python项目构建方式,适合作为毕业设计参考,也便于直接运行实验。目前已有287人浏览学习。对于希望快速掌握视频运动检测落地方法、研究OpenCV工程化应用的读者,这份资源能提供完整的项目骨架与配置思路,省去从零搭建的麻烦。

1. DVR-Scan 视频运动检测工具:在几十小时监控里找出真正的运动片段

监控录像绝大多数时间是“静止”的,24 小时素材里真正值得看的往往只有几分钟。DVR-Scan 视频运动检测工具做的事,就是把这几分钟自动挑出来:它基于 OpenCV 的背景减除模型逐帧计算画面中的运动区域,再把连续运动按时间段聚合成事件,输出时间码;需要时还能直接生成包含运动事件的视频文件。整个过程不需要训练模型,也不需要标注数据,安防运维、视频素材整理、图像处理课程设计几类场景都能直接用。下面我会从 MOG2 原理讲到参数调整,再进到安装排坑,目标是让你拿到 zip 包解压后,能在半小时内跑出自己的第一份运动事件列表。

2. 运动检测的底层逻辑:MOG2 背景减除与三个必调参数

2.1 为什么选 MOG2:背景建模、光照变化与“滑动窗口”

很多第一次用 DVR-Scan 的人会把它理解成“帧差法”:相邻两帧做差值,差值大的就是运动。帧差法做 demo 可以,做真实监控会翻车——摄像机静止不代表画面静止,从早到晚的光线变化、窗帘被风吹动、水面反光都会造成整幅画面的像素差。

更稳的做法是维护一个背景模型:把最近若干帧里“经常不变”的那个值,作为该像素的背景估计;当前帧与背景模型的差异超过阈值,就判定为前景。MOG2 就是这个思路里的一种经典实现,它对每个像素维护多个高斯分布,能同时对“静态背景”和“短暂变化”建模。某个像素一会儿是墙,一会儿是被车灯照亮的反光,MOG2 会在更新过程中给这两个状态分配不同权重。这也是它和“机器学习”标签有交集的地方:它有一组在线更新的模型参数,但本质是统计建模,不是训练分类器,不需要准备标注样本。

我实际使用中更看重它的自适应更新速度:光线在几十秒内缓慢变化,MOG2 能跟上,不会触发;有人走进画面,他的轮廓会变成清晰的前景。DVR-Scan 把这套逻辑封装成一条命令,但对使用者来说,真正要理解的是三个参数——threshold、min-area、kernel-size,它们共同控制检测的“松紧度”。这三个参数配合好了,同一段视频可以从“满屏噪点”收敛成“只有目标运动时才报警”。

2.2 threshold、min-area、kernel-size:三个参数分别管什么

参数简写控制对象我的起步值
threshold-t / --threshold当前帧与背景模型的像素差判定门槛15~30
min-area-a / --min-area单个运动区域面积占整帧的最小比例0.2~0.5
kernel-size-k / --kernel-size形态学腐蚀/膨胀的核大小7~15
mask-m / --mask黑白掩码,黑区不参与检测按需制作

threshold 控制“多大的差值算前景”。DVR-Scan 里这个值支持 0 到 255 的尺度,不同版本默认值略有差异,我拿到新环境第一件事就是看dvr-scan --help确认-t的默认值。默认值普遍偏敏感,背景稍有抖动就会出一片噪点。调到 15~30,一般能过滤压缩噪声,又不会漏掉人形目标;画面分辨率高、码率高时,这个值还可以继续上浮。

min-area 是第二个闸口:即使像素级前景很多,它们也可能分散成几个碎块,或者只是飞虫、小鸟这类小目标。min-area 设成 0.3,意味着少于画面总面积 0.3% 的运动区域不会触发生成事件。对 1080p 画面,0.3% 大约对应 6400 像素的一块区域,一个正常体型的行人靠近镜头时远大于这个面积。小目标密集的室外场景,我一般从 0.5 起步,然后再往下压。

kernel-size 是形态学处理的核。检测出的前景噪声往往是一个个孤立点,用核做“腐蚀”可以把孤立点消掉,再“膨胀”把目标轮廓补回来。默认的自动计算对多数场景够用;手动设置时 7、9、11 是常见起点。核太大容易把两个相邻的小运动目标合并成一个区域,核太小又去不掉噪点,需要结合画面里目标的实际尺寸判断。

调参阶段不建议三个参数一起动。我的做法是固定 kernel-size,先调 threshold 和 min-area;得到一份能看的事件列表之后,再去动形态学核。每次只改一个变量,否则你根本判断不了是哪一步产生了误报。顺便说一句,监控场景的运动检测没有“绝对正确”的参数组合,只有“误报率可接受”的组合,这点心里要有数。

2.3 mask 掩码:一开始就要设计的排除区

视频里有些区域永远不会被关心,比如镜头下方的路面、围墙外的树梢、画面固定角落的广告屏。与其让这些位置持续产生像素差,不如直接从检测里摘掉。DVR-Scan 提供-m参数接收一张掩码图,黑的地方忽略,白的地方才允许检测。

掩码可以手工画,也可以用 OpenCV 快速生成:

import cv2 import numpy as np # 假设输入视频分辨率 1920x1080 width, height = 1920, 1080 # 全黑幕布:整幅画面默认不检测 mask = np.full((height, width), 0, dtype=np.uint8) # 只放行画面中间区域,避开上下两端的固定噪声 cv2.rectangle(mask, (200, 200), (1720, 880), 255, -1) # 右上角有一块不定期亮起的广告屏,再单独屏蔽 cv2.rectangle(mask, (1500, 80), (1850, 300), 0, -1) cv2.imwrite("mask.png", mask)

代码逻辑:先生成一张和视频同尺寸的单通道 8 位图,全黑代表所有区域默认不检测;然后用矩形把“允许检测”的中间区域涂白,再把右上角广告屏区域涂黑。最后以 PNG 格式写盘。

注意掩码尺寸必须和输入视频一致,否则 DVR-Scan 可能直接报错或静默忽略掩码。用 JPEG 做掩码会引入边缘压缩伪影,我一般只存 PNG 或 BMP。第一次做掩码时可以故意把允许区画得保守一点,先跑一遍看事件列表,再逐步放宽,这样比一开始画大区域然后被干扰折磨要省时间。

3. 安装与初始化:把 zip 包里的 DVR-Scan 在 Windows/Linux 上跑起来

3.1 解压、检查目录结构与 Python 环境

先处理 zip 包。我习惯用 7-Zip 而不是系统自带解压工具,尤其是压缩包里文件较多时,7-Zip 对异常压缩记录的容忍度更高。解压后先打开说明文档,确认这份资源是源码方式还是已经打好包的可执行文件方式。源码方式通常包含dvr_scan目录、requirements.txt、setup.py或pyproject.toml;可执行文件方式则是 Windows 下直接能运行的.exe或 Linux 下的单文件程序。

DVR-Scan 需要 Python 3.8 及以上版本。先在终端确认版本:

python --version

如果确认是源码包,我建议不要直接往系统 Python 里装,而是新建虚拟环境,避免和 OpenCV 的其他版本冲突:

python -m venv dvr-scan-env source dvr-scan-env/bin/activate # Linux / macOS # Windows 下执行:dvr-scan-env\Scripts\activate pip install --upgrade pip pip install dvr-scan

这里pip install dvr-scan会拉取 PyPI 官方包;如果你用的是本地 zip 资源,也可以切到解压目录执行pip install .或pip install -r requirements.txt。依赖里最重要的是 opencv-python 和 numpy,其他库基本都是这两个的上层封装。

可执行文件方式就简单得多,解压后直接运行对应平台的可执行程序。需要留意的反而是杀毒软件:这种打包工具很容易被误报,如果程序一运行就闪退,先到隔离区看看可执行文件是不是被吞了。

3.2 安装 FFmpeg:DVR-Scan 输出视频的隐藏依赖

DVR-Scan 读取视频用 OpenCV,但写出视频文件时依赖 FFmpeg。不装 FFmpeg,扫描和事件时间码输出照常工作;一旦指定-o要生成运动片段视频,就会在编码初始化阶段报错。这个依赖藏得比较深,我第一次跑的时候就因此卡了十几分钟。

Windows 上安装 FFmpeg 的常规做法是下载官方 build 的 zip 包,解压后把ffmpeg.exe所在目录(通常是bin)加到系统 PATH,然后重新打开终端验证:

ffmpeg -version

能正常打印版本信息就代表环境变量生效。Linux 下更简单:

sudo apt update sudo apt install ffmpeg

装完同样用ffmpeg -version验证。需要注意,有的 Linux 发行版 ffmpeg 编译时没有启用 libx264,这会导致后面写 MP4 时提示 encoder not found,我在 5.4 会展开说。

验证 FFmpeg 是否带 x264 编码器可以用:

ffmpeg -encoders 2>/dev/null | grep 264

输出里有libx264或类似条目,说明 MP4 输出没问题;否则就准备用 AVI 容器兜底。

3.3 验证安装:跑一个最小的检测命令

环境装完之后,先找一段十几秒的测试视频。可以直接用手机对着走廊拍一段有人走动的画面,或者从监控素材里截取一小段。验证命令越简单越好,不加任何参数,只做运动检测:

dvr-scan -i test.mp4

没有指定-o,DVR-Scan 不会生成输出视频,只在终端打印检测到的事件时间码。正常情况下能看到类似这样的输出:

0:00:03.120 - 0:00:08.500 Movement Detected 0:00:10.200 - 0:00:12.400 Movement Detected

如果什么都没有输出,不要急着怀疑环境,先看第 5 章的排查步骤,极大概率是 threshold 或 min-area 设置不合适。确认检测正常后,再把事件列表落盘:

dvr-scan -i test.mp4 -e events.txt cat events.txt

-e参数把事件时间码写进文本文件,方便后续配合 FFmpeg 做片段切割。到这一步,工具链已经完整跑通,接下来进入实际扫描环节。

4. 第一次实际扫描:命令、输出与调参步骤

4.1 一个完整的扫描命令与各参数含义

对一个真实监控文件,我常用的扫描命令是这样的:

dvr-scan -i camera_20240120_0300.mp4 \ -t 25 \ -a 0.3 \ -k 9 \ -e events.txt \ -m mask.png \ -o motion_only.mp4

逐项说明:-i指定输入视频;-t 25把像素差判定门槛设为 25,过滤压缩噪声和微弱光影变化;-a 0.3要求运动区域至少占画面 0.3% 才构成事件;-k 9用 9 像素的形态学核消除孤立噪点;-e events.txt导出事件时间码;-m mask.png排除掩码里标记的黑区;-o motion_only.mp4输出一个只包含运动片段的视频。

先解释-o的行为:DVR-Scan 会把检测到的运动事件按时间顺序拼接进同一个输出文件,而不是只保留“正在动”的几帧。我实际用下来的感觉是,输出片段会比 events.txt 标记的时间略长,程序会把相邻事件前后留一点余量,方便回看时理解上下文。如果你要拿这些片段做精确剪辑,以 events.txt 为准,输出视频只用来快速预览。

这个命令里-m和-o不是必填:只想定位时间点就去掉-o;没有掩码就直接去掉-m。第一次全量扫描,我建议先不带-o跑一遍,确认事件列表符合预期,再带上-o生成片段,避免因为参数不合适生成一大段无意义视频。

4.2 事件时间戳与输出视频的关系

events.txt 的内容形如:

0:00:05.200 - 0:00:09.300 0:00:30.000 - 0:00:36.800 0:01:02.400 - 0:01:05.150

每一行是一个运动事件,前后两个时间点分别代表事件开始和结束。这个时间戳是基于视频内部时间轴的,做后续切片时直接交给 FFmpeg 用就行。

常见做法是根据扩展后的事件列表,用 FFmpeg 批量裁剪出独立片段:

while read start end; do ffmpeg -ss "$start" -to "$end" -i source.mp4 \ -c copy -y "cut_${start//:/_}.mp4" done < events.txt

这段脚本逐行读取事件时间码,用-ss和-to定位起止点,-c copy不做重编码,速度快且画质无损。文件名里的冒号会被替换成下划线,因为 Windows 路径不允许冒号。如果事件列表本身很短,直接手动跑几条 FFmpeg 命令也可以,没必要为十来个事件写脚本。

要注意的是,events.txt记录的是 DVR-Scan 判定“有运动”的区间,不代表“有人出现”的完整区间。目标走进画面和走出画面的事件边界通常会慢半拍,所以上面脚本里我没做额外扩展,想要边界的先手动在-ss上减去 1 到 2 秒,-to加上 1 到 2 秒,具体数值看片段的实际情况。

4.3 扫描太慢怎么办:frame-skip、resize 与 crop 的组合

运动检测是逐帧计算,处理十几个小时的高清监控,在普通笔记本上可能跑几个小时。绝大多数情况下我们不需要每一帧都检测,三个手段可以显著提速。

第一个是-sframe-skip,每隔 N 帧检测一次。25fps 的监控画面,人走路的速度足够在第 2 帧和第 3 帧之间留下明显位移,设成 2 通常不会漏。担心漏掉快速驶过的车辆,就设 1;画面本身只有 15fps,不建议再跳。

第二个是-rresize,把送入检测器的画面按比例缩小。1080p 的画面缩到 0.6 倍,像素点数量降到原来的 36%,MOG2 的计算开销几乎同比例下降,代价是小目标可能糊掉。适合人物占画面比例较大的场景。

第三个是-ccrop,只检测画面里的固定区域。比如只关心门口一条通道,其他区域全部跳过,这比 resize 更彻底,因为裁剪后连背景模型都不用维护。

举个例子,一段夜间走廊监控,画面只有中间区域值得关注:

dvr-scan -i long_night.mp4 \ -c 400,200,1200,680 \ -s 2 \ -r 0.8 \ -t 30 \ -a 0.2 \ -e events.txt \ -o fast.mp4

-c 400,200,1200,680表示裁剪区域左上角在 (400,200),宽 1200、高 680;-s 2跳过偶数帧;-r 0.8把裁剪后的画面再缩到 80%。这三个参数组合起来,计算量通常只有默认模式的四分之一到五分之一,对安防场景“找出可疑时间段”这个目标来说精度足够。

提速之后如果事件列表变密集,优先怀疑裁剪区域边缘的切边效应:目标从裁剪边界经过时,身体被截断成半个,MOG2 可能在边缘反复触发。解决办法是在裁剪区域外留一圈冗余,或者把 min-area 稍微调大。

5. 避坑与排查:我跑 DVR-Scan 踩过的五个坑

5.1 扫描完一个事件都没有:先确认参数方向,再看日志

现象:扫描结束后 events.txt 是空的,终端也没有任何事件输出,但视频里明明有人走动。

原因:最常见的是 threshold 设置过高,真实运动的像素差不足以超过判定门槛;其次是 min-area 设得太大,真实运动区域面积不达标,被当作小目标过滤。

解决:先回归最简命令,去掉-c、-m、-o,只留-i和极小的判定参数:

dvr-scan -i test.mp4 -t 5 -a 0.05

这样跑出来的事件通常偏多,但能确认检测链路本身没坏。确认有事件后,再逐步把 threshold 往回收。如果连最简命令都没有事件,把 DVR-Scan 的日志级别调到 debug,重点看每帧运动面积的打印值,能区分“没检测到”和“检测到但被过滤”两种情况。我第一次遇到空结果时差点怀疑工具坏了,其实只是 min-area 设成 1.0,把真实运动全滤掉了。

5.2 树叶晃动导致反复触发:形态学处理和掩码一起上

现象:白天室外场景,每隔几分钟就出一个事件,回放发现是树叶投下的影子或车辆灯光扫过墙面。

原因:MOG2 的背景更新速度赶不上快速摆动的树叶,叶影在像素层面呈现快速明暗交替,被当成前景。这个问题和 threshold 关系不大,单纯调低灵敏度又会漏掉真实行人。

解决:三步走。先把-k提高到 11 到 15,形态学核能把细碎的前景块直接抹掉;再把 min-area 提到 0.5 以上,叶影通常是大面积且分散的,单块面积不一定够;最后把树冠、墙面等固定干扰区画进掩码。如果三步走完还在触发,说明干扰太强,只能接受“漏报几个细小目标”来换取误报可控。安防场景里,误报比漏报更消耗人力,这个取舍要提前想清楚。

5.3 CPU 被拉满、输出迟迟不落地:用跳帧和缩放破局

现象:处理 5 小时监控,跑了 4 个小时进度还在 60%,CPU 持续 100%,风扇声音拉满。

原因:默认逐帧检测 1080p 画面,MOG2 模型本身就是计算密集的;如果同时开了-o,输出视频编码还会再吃一份 CPU。

解决:按 4.3 的顺序做优化——先-c裁剪去掉无关区域;再把-s设成 2 或 3;最后用-r把分辨率降到 0.6 到 0.8。调整之后精度会有小幅下降,但对“找出可疑时间段”这个目标完全够用。更重要的习惯是不要一上来就全量扫描。先截取 10 分钟片段把参数调稳,确认事件列表满意后,再对全量文件跑。调一次参数扫全量,发现不对再重扫,是我见过最浪费时间的工作方式。

5.4 提示找不到 ffmpeg 或编码器:环境变量与输出格式的坑

现象:扫描时指定了-o motion_only.mp4,程序在处理到输出阶段报错,提示找不到 FFmpeg 可执行文件,或者报 encoder not found。

原因:FFmpeg 没安装、不在 PATH 中,或者当前 FFmpeg 编译版本缺少 MP4 需要的 H.264 编码器。

解决:Windows 上把 FFmpeg 的bin目录完整加入 PATH,重新打开终端后用ffmpeg -version确认。Linux 上检查编码器支持:

ffmpeg -encoders 2>/dev/null | grep 264

没有输出就是没带 x264。这时候不要硬磕 MP4,先改用 AVI 容器输出,比如-o motion_only.avi,DVR-Scan 会走 OpenCV 内置的编码路径,绕开 ffmpeg 编码器缺失的问题。之后想转 MP4,再用 FFmpeg 把 AVI 重编码一次。内网服务器上我遇到过编译版本特别老的 ffmpeg,换 AVI 容器后立刻能用,这是最省事的兜底方案。

5.5 zip 解压报错或程序闪退:别忽略压缩包完整性

现象:zip 解压到一半提示 CRC 校验失败,或者强行解压后程序一运行就闪退、报模块缺失。

原因:下载不完整是最常见的情况,文件大小和源站不一致,断点续传在这种场景下不可靠;另一种情况是压缩包设置了伪加密标志,系统自带解压工具会误判成加密包,打开就要求输入密码;还有可能是杀毒软件把打包进 zip 的 exe 或 Python 脚本隔离了。

解决:下载后先核对文件大小,再校验 SHA-256,和发布页给出的哈希比对,不一致直接重新下载。解压用到 7-Zip 而不是系统右键,遇到提示要密码的包,先用 7-Zip 打开看看文件列表是否正常可见:可见的多半是伪加密,工具可以正常列出内容;不可见且真正加密的,没有密码基本无解,只能找发布者。杀毒软件误杀导致的闪退,把解压目录加入信任区后重新解压即可。从那以后,我每次处理这类工具包都强制走“下载→校验→解压→验证版本”四步,省掉了大量无意义的排查时间。

6. Motion Mask 的进阶技巧:把固定干扰区从检测里移除

6.1 用一张掩码图框住“允许检测”的区域

掩码是解决固定干扰最直接的工具,关键是制作方式和放置位置。我一般按这样的流程做:先用播放器打开视频,记录画面中真正需要检测的矩形范围,以及需要排除的固定干扰区;再用 OpenCV 生成掩码,白区放行,黑区屏蔽:

import cv2 import numpy as np # 分辨率要和输入视频一致,这里是 2560x1440 height, width = 1440, 2560 mask = np.zeros((height, width), dtype=np.uint8) # 道路监控:只检测中间车道 cv2.rectangle(mask, (300, 400), (2260, 1200), 255, -1) # 隔离带里有一块长年闪动的交通牌 cv2.rectangle(mask, (1000, 650), (1300, 750), 0, -1) cv2.imwrite("mask.png", mask)

np.zeros生成全黑图,默认所有区域不检测;第一个矩形把车道区域涂白;第二个矩形在白色区域内挖掉交通牌。掩码文件务必存成 PNG,不要存 JPEG,JPEG 压缩会在黑白边缘产生一圈灰色过渡像素,导致边缘区域出现意外检测。

调用时直接加参数:

dvr-scan -i input.mp4 -m mask.png -t 30 -a 0.3 -e events.txt

如果同时用了-c裁剪,掩码的坐标系统会和裁剪区域冲突。我的做法是:先确定映射关系,要么只裁一次,要么按裁剪后的区域重新生成掩码,避免两者叠加出错误区域。

6.2 我的固定验证流程:先跑小样本再全量

掩码看起来简单,实际踩坑都在“区域边界”上。比如白色区域边缘正好划过人行道,行人走过时身体一半被遮挡,MOG2 在边界上反复跳变,事件列表反而更碎。所以掩码不要贴着目标边缘画,留出至少 20 像素的余量。

我现在的固定流程是:拿到新点位视频,先截 10 分钟包含已知运动事件的样片,生成掩码后跑一遍;再从 events.txt 里找两到三个时间点,回看原始视频确认事件对应的人或车确实存在,同时确认固定干扰区没有产生事件。这一步过了,才对全量文件做正式扫描。这样做的收益很明显:掩码区域不对、阈值方向搞反这类问题,在 10 分钟样片上几分钟就能暴露,不用拿着全量视频试错。如果样片跑出来的事件数量和位置与预期差得很远,先检查掩码区域是否覆盖了“运动确实发生的位置”,而不是继续调阈值。从那以后,我每到一个新监控点位都强制走一遍同样的流程:画掩码、剪样片、验证事件,再全量。监控场景的光照、视角、干扰源差异巨大,不验证直接全量跑,很容易白跑一晚上。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 3:49:19

C语言while循环详解:从语法到实战,避开常见陷阱与调试技巧

1. 从“重复做事”说起&#xff1a;while循环到底解决了什么问题1.1 没有循环&#xff0c;代码会被逼成什么样如果你刚接触C语言&#xff0c;可能还不太理解“循环”这个概念存在的意义。我的建议是&#xff1a;先别急着背语法&#xff0c;想象一个特别朴素的场景——让你打印1…

作者头像 李华
网站建设 2026/10/2 3:48:02

从零构建AI工程体系:模型服务、数据管道与跨语言协同实战

1. 为什么“从零构建AI工程体系”不是一句空话&#xff0c;而是当前最真实的生存命题你有没有过这样的经历&#xff1a;花两周时间跑通了一个PyTorch图像分类Demo&#xff0c;准确率92%&#xff0c;兴奋地发到技术群&#xff0c;结果被一句“这算不上AI工程&#xff0c;只是调库…

作者头像 李华
网站建设 2026/10/2 3:46:52

合规站群建设与搜索引擎友好SEO实践指南

简介&#xff1a;小旋风蜘蛛池站群X8.51开心版是一款面向SEO从业者、站群运营者及中小网站管理员的搜索引擎优化专用系统&#xff0c;聚焦提升蜘蛛抓取效率与关键词排名&#xff0c;适用于需批量建站、伪静态优化及多站点统一管理的技术场景。资源为ZIP压缩包&#xff0c;大小3…

作者头像 李华
网站建设 2026/10/2 3:45:19

FireMonkey动画实战:用动画组件为Delphi窗体添加动态效果

做Delphi开发这么多年&#xff0c;如果要让我挑一个最能提升界面质感、投入产出比又极高的功能&#xff0c;FireMonkey的动画系统绝对排在前三。几乎每个第一次接触FMX窗体的人&#xff0c;都会被那种丝滑的过渡效果吸引&#xff1a;窗体淡入淡出、面板从侧边滑入、弹窗带一点柔…

作者头像 李华
网站建设 2026/10/2 3:45:17

Pinia 实战避坑:响应式丢失、持久化与调试排查

做 Vue3 项目&#xff0c;只要过了组件通信那关&#xff0c;基本都会把注意力转向 Pinia。它比 Vuex 轻量&#xff0c;写法直观&#xff0c;TypeScript 支持也舒服&#xff0c;确实配得上 Vue3 官方推荐状态管理库这个身份。但我把话说在前头&#xff1a;轻量不等于没坑&#x…

作者头像 李华
网站建设 2026/10/2 3:44:37

浅谈C++设计模式的基本原则

前言「设计模式的基本原则」这个说法有两层含义&#xff0c;容易混在一起。一层是设计模式本身的原则——GoF&#xff08;Gang of Four&#xff09;在《设计模式》一书里归纳的「面向对象设计原则」&#xff0c;比如「针对接口编程&#xff0c;而不是针对实现编程」「优先使用对…

作者头像 李华