C++ 基于黑白遮罩组合两个图像

C++ 基于黑白遮罩组合两个图像,c++,opencv,C++,Opencv,我想创建一个掩码操作 我有两个相同大小的输入图像(它们必须具有相同的深度/通道数吗?我想要任何东西,可能是3个通道,CV_32FC3或灰色…),我创建了一个相同大小的遮罩(行和列) 遮罩是用黑白区域创建的 我想创建一个新的cv::Mat,其中包含image1,其中mask有1,image2,其中mask有0 我查看了cv::filter2D和copyTo。。。也看了addWeighted,但我不想混合它们-每个图像的区域应该完全分开。roi没有帮助-遮罩可能不包含矩形,而是一个或多个多边形 我找

我想创建一个掩码操作

我有两个相同大小的输入图像(它们必须具有相同的深度/通道数吗?我想要任何东西,可能是3个通道,
CV_32FC3
或灰色…),我创建了一个相同大小的遮罩(行和列)

遮罩是用黑白区域创建的

我想创建一个新的cv::Mat,其中包含image1,其中mask有1,image2,其中mask有0

我查看了
cv::filter2D
copyTo
。。。也看了addWeighted,但我不想混合它们-每个图像的区域应该完全分开。roi没有帮助-遮罩可能不包含矩形,而是一个或多个多边形

我找不到我想要的东西

是否有任何OpenCV函数可以根据遮罩组合我的图像?还是我必须创建自己的,在行和列之间循环


谢谢。

只需使用
按位\u and()
函数,即可设置。下面的参考包括一个完整的工作示例

参考资料:



  • 在新建/编辑的情况下,应创建两个单独的遮罩,即MASK1和MASK2。将MASK1应用于IMAGE1,将MASK2应用于IMAGE2,留下结果1和结果2。现在你只需要在另一个图像上复制一个图像的一部分。谢谢,你给我的第二个参考有效,我可以将一个图像复制到结果,然后复制到第二个图像上。我仍然在玩它,当图像的深度不一样时,我会得到断言错误。。。但我想这是另一个故事。没问题。最简单的解决方案是使两幅合成图像具有相同的深度(理想情况下,使两者都使用两幅图像中较高的位深度),然后执行像素复制操作。一个简单的方法是:“对于MASK2中的每个黑色像素,将像素从RESULT2中的同一位置复制到RESULT1中的同一位置”。我一直在尝试将1通道转换为3通道,但迄今为止没有多大成功。。。我知道如何转换深度,我会为最低的图像制作一个临时图像,与最高的图像具有相同的深度。但我仍然在尝试1到3个频道。。。所以我很接近:-)看了一下cv::merge和cvtColorA灰度到RGB的转换可能就是您想要的:
    cv::Mat mask = cv::Mat(image1.rows, image1.cols, CV_8UC1);