21xrx.com
2024-12-26 16:22:34 Thursday
登录
文章检索 我的文章 写文章
如何使用C++和OpenCV实现图像覆盖
2023-07-04 23:53:37 深夜i     --     --
C++编程 OpenCV库 图像处理 图像覆盖 计算机视觉

图像覆盖是一种在图像处理和计算机视觉领域中常见的技术。它可以将两张图像进行融合,从而得到一张新的图像。在本文中,我们将介绍如何使用C++和OpenCV实现图像覆盖。

1. 加载两张图像

首先,需要加载两张图像。我们可以使用OpenCV中的imread函数来加载两张图像。这里我们假设两张图像的大小、格式都相同。具体的代码如下:


Mat src1 = imread("image1.jpg");

Mat src2 = imread("image2.jpg");

2. 创建一个掩码

接下来,我们需要创建一个掩码来确定哪些像素属于第一张图像,哪些像素属于第二张图像。在OpenCV中,我们可以使用Mat类创建一个和图像大小相同的矩阵来作为掩码。掩码中每个像素的值可以是0或者255,表示该像素属于第一张图像还是第二张图像。具体的代码如下:


Mat mask = Mat::zeros(src1.size(), CV_8UC1);

rectangle(mask, Point(100, 100), Point(400, 400), Scalar(255, 255, 255), -1);

上面的代码中,我们创建了一个大小和src1相同的掩码,初值全部设为0。然后我们在掩码中画了一个矩形,表示第一张图像所在的区域。最后,我们将这个矩形区域的像素值设为255,表示这部分像素属于第一张图像。

3. 将两张图像融合起来

最后,我们可以使用OpenCV中的addWeighted函数将两张图像融合起来。addWeighted函数的原型如下:


void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

其中,src1和src2分别是两张输入图像,alpha和beta表示这两张图像融合的比例,gamma是一个可选的亮度调整参数,.dtype表示输出图像的数据类型。具体的代码如下:


Mat dst;

addWeighted(src1, 1.0, src2, 1.0, 0.0, dst);

Mat final_img;

src1.copyTo(final_img, mask);

dst.copyTo(final_img, ~mask);

在这个例子中,我们将两张图像的融合比例都设置为了1,表示两张图像的权重相同。然后,我们使用copyTo函数将第一张图像复制到final_img中。第二个参数表示掩码,这样只有第一个矩形区域的像素才会被复制到final_img中。

之后,我们将dst中除了第一个矩形区域的部分复制到final_img中。这里我们使用了~运算符来取反掩码,表示除了第一个矩形区域的像素都属于第二张图像。

4. 显示结果

最后,我们可以使用imshow函数来显示最终的图像。完整代码如下:


#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char** argv)

{

  Mat src1 = imread("image1.jpg");

  Mat src2 = imread("image2.jpg");

  

  Mat mask = Mat::zeros(src1.size(), CV_8UC1);

  rectangle(mask, Point(100, 100), Point(400, 400), Scalar(255, 255, 255), -1);

  

  Mat dst;

  addWeighted(src1, 1.0, src2, 1.0, 0.0, dst);

  

  Mat final_img;

  src1.copyTo(final_img, mask);

  dst.copyTo(final_img, ~mask);

  

  imshow("Final Image", final_img);

  waitKey(0);

  

  return 0;

}

使用C++和OpenCV实现图像覆盖非常简单。依次加载两张图像,创建一个掩码确定哪些像素属于第一张图像,调用addWeighted函数将两张图像融合起来,然后再根据掩码将两张图像的像素进行合并,最后显示结果即可。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复