Correct chromakey (some code inside)

anon347

New Member
Hi! I want to overlay image on video the use green chromakey. For example, there's two pictures that I want to combine together:
- example of video
and
- example of my overlay

At the moment, I can choose green color in the settings and get something like this:
- 10% similarity
 

Attachments

  • back.png
    440.9 KB · Views: 139
  • text.png
    112.8 KB · Views: 92
  • obs-10-0.png
    296 KB · Views: 94

anon347

New Member
I can increase level of similarity to 100%, but I steel get some green channel:


I can add blen level to 100, but it don't help to remove all green pixels:


For example, you can see here After Effects filter "key light", I expect to see more
- no green ever!
 

Attachments

  • obs-100-0.png
    413.1 KB · Views: 54
  • obs-100-100.png
    438.5 KB · Views: 37
  • ae-keylight.png
    404.5 KB · Views: 50

anon347

New Member
GIMP

For example, it GIMP "color to alpha" with green color:
- good, but some purple colors on gradients, compare with:
- it's more expected, but the previous version is acceptable

You may be able to take the algorithm of GIMP and use it in your program?
 

Attachments

  • gimp.png
    411.1 KB · Views: 57
  • gimp-lightonly.png
    410.9 KB · Views: 39

anon347

New Member
My version


My algo, here steel some dirty-yellow colors, but black and white gradients are perfect

My code here. At first, I use ImageMagick to load images:

Code:
  int width;
  int height;
  int bytes;
  unsigned char *back;
  unsigned char *mask;

  MagickWandGenesis ();
  MagickWand *wand = NewMagickWand ();

  // load background

  MagickReadImage (wand, "back.png");
  width = MagickGetImageWidth (wand);
  height = MagickGetImageHeight (wand);
  bytes = width * height * 3;

  back = malloc (bytes);
  MagickExportImagePixels (wand, 0, 0, width, height, "RGB", CharPixel, back);

  // load overlay

  MagickWand *wand2 = NewMagickWand ();
  MagickReadImage (wand2, "text.png");
  mask = malloc (bytes);
  MagickExportImagePixels (wand2, 0, 0, width, height, "RGB", CharPixel, mask);

and then process image
The code is not optimal, but it works and gives to understand how the algorithm works

Code:
  for (q = 0; q < bytes; q += 3){
      r = mask[q];
      g = mask[q + 1];
      b = mask[q + 2];

      if (g == 255 && r == 0 && b == 0)
        {
          alpha = 0;
          goto redraw;
        }
      if (g <= r || g <= b)
        {
          alpha = 1;
          goto redraw;
        }

      lev = g - r > g - b ? g - b : g - r;
      g -= lev;
      alpha = lev / 255.0;

    redraw:

      if (alpha == 1)
        {
// nothing
        }
      else if (alpha == 0)
        {
          r = back[q];
          g = back[q + 1];
          b = back[q + 2];
        }
      else
        {
          scale = 1 - alpha;
          r = (int) ((double) r + (double) back[q] * alpha);
          g = (int) ((double) g + (double) back[q + 1] * alpha);
          b = (int) ((double) b + (double) back[q + 2] * alpha);
        }

      back[q] = r;
      back[q + 1] = g;
      back[q + 2] = b;
    }

and finally, save image:

Code:
  MagickImportImagePixels (wand, 0, 0, width, height, "RGB", CharPixel, back);
  MagickWriteImage (wand, "result.png");

Please, add this chromakey to OBS. Or gimp version.

There are several versions of images, simply attach to the case, if they are interested in
 

Attachments

  • result.png
    403.8 KB · Views: 81
  • colorful.png
    447.1 KB · Views: 49
  • noisy.png
    457.5 KB · Views: 45

Muf

Forum Moderator
Image Source uses Color Key, not Chroma Key. It's a different algorithm, made for different purposes. For what you want, just use a PNG file with embedded alpha channel; no keying needed. If you want to see OBS' chroma key algorithm at work, try adding a Video Capture Device and enable the Chroma Key feature there.
 

anon347

New Member
Muf said:
For what you want, just use a PNG
No, I do not want a static image, I want another video on top of it (realtime)

Muf said:
try adding a Video Capture Device and enable the Chroma Key feature there.
Surprised by the presence of such a function in "Video Capture Device", but its absence in "Monitor Capture/Window Capture". In games capture mode, none at all keying is provided at all.

I want to capture a window/monitor with some realtime graphics, and its contents are to composed over the video.
I don't have any devices for "video capture device", and I think the emulation webcam (screen capture video to virtual webcam) through another program - not the best solution
 

umer147

New Member
Surprised by the presence of such a function in "Video Capture Device", but its absence in "Monitor Capture/Window Capture". In games capture mode, none at all keying is provided at all.
 

dodgepong

Administrator
Forum Admin
The standard way to get a feature added to an open source project is to fork the project, add the code, then submit a pull request.
 
Top