it-swarm.cn

将Mask应用于OpenCV中的图像?

我有一个二进制掩码,我想永久应用于彩色图像我该怎么做?二进制掩码应该是永久性的 - 因为我不希望每次调用函数时都将掩码重新应用于图像。

基本代码示例将不胜感激。如果您使用代码,请解释代码而不是发布代码。

谢谢

16
fdh

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

8
SSteve

虽然@perrejba的答案是正确的,但它使用了传统的C风格函数。由于问题标记为C++,您可能希望使用方法:

inputMat.copyTo(outputMat, maskMat);

所有对象都是cv::Mat类型。

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

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

如果要永久更改原始映像,则必须执行其他复制/克隆/分配。未为重叠输入/输出图像定义copyTo()函数。所以你不能使用相同的图像作为输入和输出。

54
Chaos_99

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

cvCopy(origImage,destImage,mask);

其中mask应该是一个8位单通道数组。

OpenCV文档中查看更多信息

5
volpato

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

import cv2

def apply_mask(frame, mask):
    """Apply binary mask to frame, return 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);
2
rudyryk

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

啊,艾哈迈德。

#include "cv.h"      // include it to used Main OpenCV functions.
#include "highgui.h" //include it to use GUI functions.

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    int c;

int radius=100;
      CvPoint2D32f center;
    //IplImage* color_img;
      Mat image, image0,image1; 
        IplImage *tmp;
    CvCapture* cv_cap = cvCaptureFromCAM(0);

    while(1)  {
        tmp = cvQueryFrame(cv_cap); // get frame
          // IplImage to Mat
            Mat imgMat(tmp);
            image =tmp; 



    center.x = tmp->width/2;
    center.y = tmp->height/2;

         Mat Mon_mask(image.size(), CV_8UC1, Scalar(0,0,0));


        circle(Mon_mask, center, radius, Scalar(255,255,255), -1, 8, 0 ); //-1 means filled

        bitwise_not(Mon_mask,Mon_mask);// commenté ou pas = RP ou DMLA 





        if(tmp != 0)

           imshow("Glaucom", image); // show frame

     c = cvWaitKey(10); // wait 10 ms or for key stroke
    if(c == 27)
        break; // if ESC, break and quit
    }
    /* clean up */
    cvReleaseCapture( &cv_cap );
    cvDestroyWindow("Glaucom");

}
0
Ahmed