Наложение прозрачного изображения на выход камеры в opencv - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть прозрачные изображения [показано ниже], и я пытаюсь наложить их на функцию aishack.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. Захват камеры

Camera Capture

  1. Негативное изображение

Negative Image

Вывод из cvOverlayImage ()

Output

Как видите, я не получаю то, что мне нужно. Пожалуйста, помогите мне.

Ответы [ 3 ]

2 голосов
/ 03 октября 2012

Одно из решений, которое я использовал, - просто определить, где присутствует белый, и в этих случаях просто использовать пиксель из исходного изображения.В противном случае используйте пиксель наложенного изображения.Хорошо сработало для меня в аналогичной ситуации.Кроме того, если загружаемое изображение имеет альфа-канал и может использоваться в качестве маски, это даже лучше.

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);
        }
    }
}
1 голос
/ 08 ноября 2011

Это не проверено, но не должно ли S [i] + D [i] = 1 сохранить общую интенсивность?

0 голосов
/ 18 февраля 2013

Я думаю, что вы хотите добиться не сложения, а умножения:

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

Таким образом, значение пикселя будет исходным значением для пикселя с белым наложением и черного для пикселя с наложением черного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...