基于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
相关产品推荐
相关产品推荐

