使用图像作为另一个人的面具

时间:2011-04-29 02:44:32

标签: c++ image-processing opencv

我是OpenCV的初学者,我有一些问题:

如何将一个图像用作另一个图像的遮罩?

例如,我的图片包含空心圆,而另一张图片则包含内容(非空)和背景的圆圈。

如何在新图像中提取两个图像的公共部分?

我尝试逐个像素地提取(AND)操作,但它失败了!

任何人都可以帮助我获得一些想法!

我尝试下面的代码(我在这里找到),但它产生了错误的结果!

我通过替换

尝试了二进制图像
CvScalar bgr = cvScalar(b, g, r);
cvSet2D(mask, iy+y, ix+x, bgr);

CvScalar bgr = cvScalar(b);
cvSet2D(mask, iy+y, ix+x, b);

void processImage(IplImage* mask, IplImage* source, int x, int y) {
    int b,g,r;
    for (int ix=0; ix<source->width; ix++) {
        for (int iy=0; iy<source->height; iy++) {
            //r = cvGet2D(source, iy, ix).val[2] * cvGet2D(mask, iy, ix).val[2];
            //g = cvGet2D(source, iy, ix).val[1] * cvGet2D(mask, iy, ix).val[1];;
            b = cvGet2D(source, iy, ix).val[0] * cvGet2D(mask, iy, ix).val[0];

            CvScalar bgr = cvScalar(b); //, g, r);
            cvSet2D(mask, iy+y, ix+x, b); //gr);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你有一个掩码(二进制图像),你想要与你的源图像和它。试试这个:

cvAnd(source, source, destination, mask)

那个双source没有拼写错误。您只是将source与自身进行了对比(无操作),但仅适用于mask中“开启”的那些像素(即!= 0)。请注意,掩码必须是8位单通道图像。