gpt4 book ai didi

c++ - 如何将 Logo 作为水印添加到图像中?

转载 作者:太空狗 更新时间:2023-10-29 21:31:36 40 4
gpt4 key购买 nike

最近,我对使用 OpenCV 进行图像处理很感兴趣,但我是新手。

我对很 multimap 片做了一些简单的图像处理,最后我想给每张图片加水印,标志是一个小的 png 图片。

有很多代码可以混合两个图像。这是我用来混合两个图像的示例:

int main( int argc, char** argv )
{
double alpha = 0.5; double beta; double input;
Mat src1, src2, dst;

// main image with real size.(Large)
src1 = imread("a.jpg");

// logo which will be used as a watermark.(small size)
src2 = imread("logo.png");

namedWindow("Linear Blend", 1);
beta = ( 1.0 - alpha );

addWeighted( src1, alpha, src2, beta, 0.0, dst);

imshow( "Linear Blend", dst );

waitKey(0);
return 0;
}

这里,两个图像应该是相同类型和相同大小,而我的 Logo 图像是一个小图像,我想将其混合到角落的主图像(实际上是在任意点)。

有人可以帮我做吗? (也许,一种解决方案是从 Logo 创建一个与主图像大小相同的矩阵,因此 Logo 外部的每个点都应为零,然后最终混合两个大小相同的图像。)

我的最终代码是这样的:

int main( int argc, char** argv )
{
double alpha = 0.5; double beta; double input;
Mat src1, src2, src2_copy, dst;

src1 = imread("a.jpg");
src2 = imread("logo.png");


resize(src2, src2_copy, src2.size() / 2, 0.5, 0.5);

int x = 100;
int y = 100;
int w = src2_copy.size().width;
int h = src2_copy.size().height;
cv::Rect pos = cv::Rect(x, y, w, h);


dst = src1.clone();

namedWindow("Linear Blend", 1);
beta = ( 1.0 - alpha );

addWeighted(src1(pos), alpha, src2_copy, beta, 0.0, dst);

imshow("Linear ", dst);


waitKey(0);
return 0;
}

最佳答案

您可以访问一个(矩形)region of interest (ROI)cv::Mat 中使用 cv::Rect (参见 documentation on the base class ),由 x, 描述y宽度高度。这是一种广泛使用的技术,在很多用例中都很方便!

因此,现在您只需要在主图像中设置适当的 ROI 并在其中混合水印。让我们看一下下面的代码片段:

// Artificial main image
cv::Mat img = cv::Mat(300, 300, CV_8UC3, cv::Scalar(128, 128, 128));

// Artificial watermark
cv::Mat wtm = cv::Mat(25, 25, CV_8UC3, cv::Scalar(0, 0, 255));

// Position of watermark in main image
int x = 30;
int y = 35;
int w = wtm.size().width;
int h = wtm.size().height;
cv::Rect pos = cv::Rect(x, y, w, h);

// Blending
double alpha = 0.7;
double beta = (1.0 - alpha);
cv::addWeighted(img(pos), alpha, wtm, beta, 0.0, img(pos));

人造主图是这样的:

Main image

人工水印图像是这样的:

Watermark

最后的结果是这样的:

Result

如你所见,在

cv::addWeighted(img(pos), alpha, wtm, beta, 0.0, img(pos))

ROI img(pos) 用作操作的源和目标,因此您可以进行就地混合。如果你想有一个单独的输出图像,同时保持你的主图像不变,也许在开始时克隆你的主图像,即

cv::Mat dst = img.clone()

然后使用 dst(pos) 而不是 img(pos) 进行混合。

希望对您有所帮助!

关于c++ - 如何将 Logo 作为水印添加到图像中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57784853/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com