为什么通过设置ROI无法修改图像(opencv)

本文介绍了一个用于视频特定区域背景替换的函数实现过程及其问题解决办法。最初尝试通过克隆方式替换背景,但发现并未达到预期效果。经过分析,找到了问题所在并给出了正确的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中的一个小功能,需要实现视频特定区域的背景替换,遂写下这样一个函数:

void bgReplace(Mat& dst, Mat&bg, Rect rec)
{
    assert(dst.size()==bg.size());
    assert(dst.depth() == bg.depth());
    dst(rec) = bg(rec).clone();//可深可浅
}

功能,用rec指定需要替换的区域,用bg的该区域值替换dst的该区域值。
但是,出乎意料的是这个函数什么也没做,根本没有达到预期,按我所想,对ROI 区域的一切操作就是对源图像的直接操作啊,因为两者是共享同一块内存区域啊,而且我还用了深复制,然而,真是想多了。

具体原因,我们可以将程序分解一下再看:

void bgReplace(Mat& dst, Mat&bg, Rect rec)
{
    assert(dst.size()==bg.size());//1
    assert(dst.depth() == bg.depth());//2
    Mat tmp=dst(rec);//3
    tmp= bg(rec);//可深可浅//4
}

在3句执行完后,tmp和dst共享同一块数据,但是在4句执行完时,tmp是和bg共享同一块数据,而不是dst,这里只是进行了一次矩阵头信息的改变,并未改变原始数据。
修改后程序为:

void bgReplace(Mat& dst, Mat&bg, Rect rec)
{
    assert(dst.size()==bg.size());
    assert(dst.depth() == bg.depth());
    bg(rec).copyTo(dst(rec));//可深可浅
}

问题很简单,只因自己犯了错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值