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

1. 图像ROI获取

  • 源代码
#include

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;
}
  • 运行结果
    从原图片中截取头像
    OpenCV学习笔记(03) :图像ROI以及线性混合_第1张图片
  • 程序解读
    实现程序中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
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图像,并保存至本地。
    OpenCV学习笔记(03) :图像ROI以及线性混合_第2张图片
    OpenCV学习笔记(03) :图像ROI以及线性混合_第3张图片
    OpenCV学习笔记(03) :图像ROI以及线性混合_第4张图片
  • 程序解读
    图像混合通过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), 不然会出现运行时异常。

你可能感兴趣的:(OpenCV)