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

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

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));//可深可浅
}

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中使用OpenCV进行ROI(感兴趣区域)操作可以通过以下步骤实现: 1. 导入OpenCV库: ```cpp #include <opencv2/opencv.hpp> ``` 2. 加载图像: ```cpp cv::Mat srcImage = cv::imread("image.jpg"); ``` 3. 定义ROI区域: ```cpp cv::Rect roiRect(x, y, width, height); ``` 其中,`x`和`y`是ROI区域的左上角坐标,`width`和`height`是ROI区域的宽度和高度。 4. 提取ROI区域: ```cpp cv::Mat roiImage = srcImage(roiRect); ``` 这将从原始图像中提取ROI区域,并将其保存在名为`roiImage`的新图像中。 5. 对ROI区域进行操作: 现在,您可以对提取的ROI区域`roiImage`进行任何所需的操作,例如修改像素值、应用滤波器、计算统计信息等。 下面是一个完整的示例代码,演示如何在C++中使用OpenCV进行ROI操作: ```cpp #include <opencv2/opencv.hpp> int main() { // 加载图像 cv::Mat srcImage = cv::imread("image.jpg"); // 定义ROI区域 cv::Rect roiRect(100, 100, 200, 200); // 提取ROI区域 cv::Mat roiImage = srcImage(roiRect); // 对ROI区域进行操作(这里只是显示ROI图像) cv::imshow("ROI Image", roiImage); cv::waitKey(0); return 0; } ``` 在上面的示例中,我们首先加载了一张图像`srcImage`。然后,我们定义了一个ROI区域`roiRect`,它位于图像中心的正方形区域。接下来,我们使用ROI区域操作符重载提取了ROI图像,并将其保存在`roiImage`中。最后,我们使用`imshow`函数显示ROI图像,并使用`waitKey`等待用户按下任意键来关闭显示窗口。 请确保您已经加载了正确的图像文件,并根据您的需求调整ROI区域的参数。 希望这个示例对您有帮助。如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值