将图像复制到其他图像的一部分

时间:2018-07-18 10:10:40

标签: c++ opencv

我正在尝试将一个图像复制到另一个图像(在图像的右下角放置一个徽标)。我的代码成功地将徽标复制到了房间图像上,但是当我戴上口罩时,它做了一些奇怪的拉伸。

while(!hasActiveHolder){ }

我的结果: enter image description here

遮罩为: enter image description here

2 个答案:

答案 0 :(得分:2)

您的徽标似乎是彩色图像。这意味着您的<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>图像也是彩色图像。当您将其用作遮罩时,它将被水平拉伸,因为额外的通道会被解释为更多的列。

尝试在阈值之前添加thresh,并在阈值中使用cvtColor(logo, grayLogo, CV_BGR2GRAY)

答案 1 :(得分:1)

遮罩大小和图像大小不相等(这就是为什么拉伸遮罩的原因)。为了解决这个问题,您应该创建蒙版图像并在适当位置复制脱粒徽标。 [编辑]:根据sunreef的回答-口罩中的三个通道也可能是您遇到问题的根源。

下面发布的代码对我有用。

cv::Mat t_roomImage = cv::imread("E:\\Workspace\\KS\\misc\\M4nKr.jpg");
cv::Mat t_logoImage = cv::imread("E:\\Workspace\\KS\\misc\\7sFbv.jpg",0);

cv::threshold(t_logoImage, t_logoImage, 10, 255, CV_THRESH_BINARY);
cv::Mat t_mask = cv::Mat::zeros(t_roomImage.size(), CV_8U);
cv::Rect t_rect = cv::Rect(t_mask.cols - t_logoImage.cols, t_mask.rows - 
t_logoImage.rows, t_logoImage.cols, t_logoImage.rows);
t_logoImage.copyTo(t_mask(t_rect));
t_roomImage.setTo(cv::Scalar(255, 0, 0), t_mask);

我使用了setTo,因为我没有徽标图像。在那里,您可以改用copyTo。

结果:

Mask Result

相关问题