0

我有透明图像 [如下所示],我试图用aihack.in cvOverlayImage() 函数覆盖它以将其覆盖在相机源上

cvOverlayImage()

    void cvOverlayImage(IplImage* src, IplImage* overlay, CvPoint location, CvScalar S, CvScalar D)
    {
     int x,y,i;

      for(x=0;x < overlay->width -10;x++)
        {
            if(x+location.x>=src->width) continue;
            for(y=0;y < overlay->height -10;y++)
            {
                if(y+location.y>=src->height) continue;
                CvScalar source = cvGet2D(src, y+location.y, x+location.x);
                CvScalar over = cvGet2D(overlay, y, x);
                CvScalar merged;
                for(i=0;i<4;i++)
                merged.val[i] = (S.val[i]*source.val[i]+D.val[i]*over.val[i]);
                cvSet2D(src, y+location.y, x+location.x, merged);
            }
        }
    }

调用 cvOverlayImage()

cvOverlayImage(image_n, neg_img, cvPoint(0, 0), cvScalar(1.0,1.0,1.0,1.0), cvScalar(0.1,0.1,0.1,0.1));

cvOverlayImage() 的输入

  1. 相机捕捉

相机捕捉

  1. 负面形象

负面形象

cvOverlayImage() 的输出

输出

如您所见,我没有得到我需要的东西。请帮助我。

4

3 回答 3

2

我使用的一种解决方案是简单地检测白色存在的位置,在这些情况下,只需使用源图片中的像素。否则使用覆盖图片的像素。在类似的情况下对我来说效果很好。另外,如果你加载的图片有alpha通道并且可以用作遮罩,那就更好了。

void cvOverlayImage(IplImage* src, IplImage* overlay, CvPoint location, 
CvScalar S, CvScalar D)
{
 int x,y,i;

  for(x=0;x < overlay->width;x++)
    {
        if(x+location.x>=src->width) continue;
        for(y=0;y < overlay->height;y++)
        {
            if(y+location.y>=src->height) continue;
            CvScalar source = cvGet2D(src, y+location.y, x+location.x);
            CvScalar over = cvGet2D(overlay, y, x);
            CvScalar merged;
            if(over.val[0] == 255 && over.val[1] == 255 && over.val[2] == 255 && over.val[3] == 255)
            {
                // White pixel so don't overlay
                for(i=0;i<4;i++)
                    merged.val[i] = (source.val[i]);
            }
            else
            {
                for(i=0;i<4;i++)
                    merged.val[i] = (over.val[i]);

            }

            cvSet2D(src, y+location.y, x+location.x, merged);
        }
    }
}
于 2012-10-03T18:34:30.417 回答
1

这没有经过测试,但不应该 S[i]+D[i] = 1 来保持总强度吗?

于 2011-11-07T20:14:15.390 回答
0

我认为你想要实现的不是加法而是乘法:

int multiplicator = over.val[i] / 255 // 0 for black, 1 for white
merged.val[i] = source.val[i] * multiplicator;

这样,像素值将是白色覆盖像素的原始值和黑色覆盖像素的原始值。

于 2013-02-18T11:43:38.593 回答