首页 > 学院 > 开发设计 > 正文

OpenCV学习笔记(03) :图像ROI以及线性混合

2019-11-11 04:57:12
字体:
来源:转载
供稿:网友

1. 图像ROI获取

源代码#include<opencv2/opencv.hpp>using namespace cv;int main(){ Mat src = imread("E://Test.jpg"); Mat src_ROI; src_ROI = src(Rect(100, 0, 300, 300)).clone(); imshow("SRC",src); imshow("ROI", src_ROI); waitKey(0); return 0;}运行结果 从原图片中截取头像 这里写图片描述程序解读 实现程序中ROI选取只通过一句src(Rect(100, 0, 300, 300))即可实现,原理是什么呢?通过读API发现,Mat类定义中,对括号运算符进行了重载Mat cv::Mat::Operator() (const Rect & roi) const;

通过 cv::Rect()函数指定ROI区域范围,返回Mat型ROI,注意,这里的ROI是引用值,如果原图像被修改,ROI会随之而变。 除此之外,还可以通过Range类来指定ROI区域,用法与上类似。

Mat cv::Mat::operator()(Range rowRange,Range colRange)const

Range类是OpenCV中的抽象数据类,表示连续数据的起始位置,可以理解为,Range=[star,end];

2. 图像的线性混合

源代码#include<opencv2/opencv.hpp>using namespace cv;int main(){ Mat src1 = imread("E://1.jpg"); Mat src2 = imread("E://2.jpg"); Mat dst; imshow("src1", src1); imshow("src2", src2); addWeighted(src1, 0.5, src2, 0.5,0.0,dst); imshow("dst", dst); waitKey(0); imwrite("E://3.jpg", dst); return 0;}运行结果 通过读取并混合src1和src2,得到dst图像,并保存至本地。 这里写图片描述 这里写图片描述 这里写图片描述程序解读 图像混合通过cv::addWeighted() 函数来实现,其定义为:void cv::addWeighted( InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1 )

其中,InputArray和OutputArray是OpenCV提供的强大的接口类,兼容Mat类型,因此,在这里,可以当做Mat类型进行处理。

alpha和beta分别是输入图像对应的权重,均为double型,而gamma是混合图像相加的标量,该过程计算如下:

dst(I)=saturate(src1(I)∗alpha+src2(I)∗beta+gamma)

I表示图像,gamma是通过+的运算符重载,加到每一个像素点上。

注意,输入的图像必须具有相同的图像尺寸(rows和cols)和深度(depth和channels), 不然会出现运行时异常。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表