OpenCV中图像及子图像ROI之间的复制

转载地址:

http://blog.csdn.net/viewcode/article/details/7823237

opencv的图像及子图像复制1.x版本与2.x版本的使用方式有很大不同。

1.x版本采用cvCopy或cvSetImageROI, cvCopy, cvResetImageROI的方式实现。

而2.x版本以后,图像用Mat来表示。图像的复制方法比较多,例如

src.clone()

src.copyTo(dst)

src.copyTo(dst, mask)
dst与src类型相同时,直接创建并复制图像数据(深copy),

src.convertTo(dst, type, scale, shift)

当src.depth==dst.depth且noscale时,等同于copyTo(创建并复制);其他,转换并复制数据。


而复制子图像ROI采用1.x版本的思路就比较费劲了。

Mat图像提供了adjustROI来更改图像的ROI,但使用起来很不方便。如果采用1.x版本的实现,将图像由Mat转换为IplImage格式,就更麻烦了。

但Mat提供引用的方式获取子图像数据。如

m.row(i), m.col(h), m.rowRange(), m.colRange(),这几个函数的实现都源于

m(roi),创建新的Mat header,并不复制图像数据。相当于返回ROI子图像的引用。

这样,复制一个图像的ROI到另外一个图像的指定区域就简单多了。如opencv中给出的例子

Rect r(1, 1, 10, 20); // 指定src 的 ROI子图像区域
Mat dstroi = dst(Rect(0,10,r.width,r.height)); // 拿到 dst指定区域子图像的引用
src(r).convertTo(dstroi, dstroi.type(), 1, 0); // ROI子图像之间的复制
此时,无需指定图像的ROI,计算也比较方便,清晰。


ps: m.reshape 更改图像的维度(通道数),但并不更改原始图像的数据,原理等同于 更改mat header 信息,获取子图像引用,但不复制图像数据。

repeat(), flip()操作都会创建新的dst图像并复制src数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值