You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenCV的视频基础变化检测C++移植问题:absdiff异常

解决OpenCV C++视频变化检测中firstFrame与gray始终相等的问题

首先直接点明核心问题:你遇到的absdiff结果始终为0的情况,根源在于OpenCV的Mat对象默认赋值是浅拷贝,导致firstFrame和gray共享了同一块像素内存。

问题拆解

当你执行firstFrame = gray;时,并没有真正复制gray的像素数据,只是让firstFrame的头部信息(数据指针、尺寸等)指向了和gray相同的内存区域。后续每次循环中,你对gray执行GaussianBlur等操作时,实际上修改的是这块共享内存的数据——所以firstFrame的内容也会跟着同步变化,自然每次absdiff时两者完全相等,检测不到任何差异。

修复方案

把浅拷贝改成深拷贝,确保firstFrame拥有独立的像素数据。修改初始化firstFrame的代码:

原来的代码:

firstFrame = gray;

替换成以下两种方式之一即可:

// 方式1:使用clone()方法直接复制整个Mat
firstFrame = gray.clone();

// 方式2:使用copyTo()方法将数据拷贝到firstFrame
gray.copyTo(firstFrame);

额外小提示

你的代码里还有一个容易忽略的细节问题:rectangle的颜色参数(0,255,0)在C++中是逗号表达式,最终会被解析为0(黑色),导致你画的运动框可能看不到。应该改成Scalar(0,255,0)来表示绿色:

rectangle( frame, boundRect.tl(), boundRect.br(), Scalar(0,255,0), 1, 8, 0 );

修改后再运行,应该就能正常检测到视频中的运动变化了。

内容的提问来源于stack exchange,提问作者C.Radford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:46:21