C++ 如何在OpenCV中将遮罩应用于图像?

C++ 如何在OpenCV中将遮罩应用于图像?,c++,image,image-processing,opencv,mask,C++,Image,Image Processing,Opencv,Mask,我想对彩色图像应用二值遮罩。 请提供一个基本的代码示例,并对代码的工作原理进行适当的解释 此外,是否有一些选项可以永久应用掩码,以便所有功能仅在掩码内运行?您不会对图像应用二进制掩码。(可选)在处理函数调用中使用二进制掩码来告诉函数要处理图像的哪些像素。如果我完全误解了您的问题,您应该添加更多细节来澄清。您可以使用遮罩仅将原始图像的感兴趣区域复制到目标图像: cvCopy(origImage,destImage,mask); 其中,掩码应为8位单通道阵列 更多信息请参见。@perrejba的答

我想对彩色图像应用二值遮罩。 请提供一个基本的代码示例,并对代码的工作原理进行适当的解释


此外,是否有一些选项可以永久应用掩码,以便所有功能仅在掩码内运行?

您不会对图像应用二进制掩码。(可选)在处理函数调用中使用二进制掩码来告诉函数要处理图像的哪些像素。如果我完全误解了您的问题,您应该添加更多细节来澄清。

您可以使用遮罩仅将原始图像的感兴趣区域复制到目标图像:

cvCopy(origImage,destImage,mask);
其中,
掩码
应为8位单通道阵列


更多信息请参见

。@perrejba的答案是正确的,但它使用传统的C风格函数。由于问题是标记C++,所以您可能需要使用一种方法:
inputMat.copyTo(outputMat,maskMat)

所有对象的类型均为
cv::Mat

请注意屏蔽是二进制的。掩码中的任何非零值都被解释为“do copy”。即使遮罩是灰度图像

还要注意,.copyTo()函数在复制之前不会清除输出


如果要永久更改原始图像,则必须执行额外的复制/克隆/分配。没有为重叠的输入/输出图像定义copyTo()函数。因此,您不能将同一图像用作输入和输出。

以下是一些代码,用于对从网络摄像头获取的视频帧序列应用二进制掩码。 注释并取消注释“bitwise_not(Mon_mask,Mon_mask);”行并查看效果

最好的, 艾哈迈德


这个问题出现在搜索结果的顶部,所以我相信我们需要这里的代码示例。下面是Python代码:

import cv2

def apply_mask(frame, mask):
    """Apply binary mask to frame, return in-place masked image."""
    return cv2.bitwise_and(frame, frame, mask=mask)
遮罩和帧的大小必须相同,因此,当遮罩为
1
时,像素保持原样,当遮罩像素为
0
时,像素设置为零

对于
C++
,它有点不同:

cv::Mat inFrame; // Original (non-empty) image
cv::Mat mask; // Original (non-empty) mask

// ...

cv::Mat outFrame;  // Result output
inFrame.copyTo(outFrame, mask);

一些简单的例子是helpful@Vitovalov我认为这适用于例如SIFT或SURF之类的功能,它使用了OpenCV的旧的遗留C API。你应该使用和推荐C++ API,你只需要图像.Copyto(DST,掩码);code>copyTo
仅对部分重叠的图像未定义,因此您应该能够使用它应用遮罩,而无需创建新矩阵。From:“虽然m.copyTo(m);工作完美,但该函数不能处理源矩阵和目标矩阵之间部分重叠的情况。”如提问者所述,如果您提供“代码,请解释代码,而不是仅仅发布代码。”
cv::Mat inFrame; // Original (non-empty) image
cv::Mat mask; // Original (non-empty) mask

// ...

cv::Mat outFrame;  // Result output
inFrame.copyTo(outFrame, mask);