Green Screen Zwifting with retroreflective fabric

11 Jan 2021

As group bike rides are doubly out this pandemic-laden winter, I've been doing more bike racing on Zwift, and playing with livestreaming races.

Zwift streams in-world aren't especially exciting. It's way more fun when you can watch a video of the person riding and suffering along. And if you're going to be suffering, you want to increase the production value.

I've been having a great time adding chroma key (green screen) to my video. Traditionally this has been a pain, requiring significant investments in lighting and screen positioning to do well. But with some LEDs and retroreflective fabric, you can make a well-functioning green screen on the cheap.

Most green screens use, well, green fabric. But this approach uses a different strategy: putting a ring of green LEDs around a camera and pointing it at retroreflective fabric, so the green light shines directly back at the source.

green4

For the most part, I followed this guide on Brainy Bits.

I was able to build this all out for about $40, which is a steal compared to other green screens.

Materials Needed

I presume you have a webcam already.

  • Retroreflective fabric: I picked up four yards from an eBay seller in Canada.
  • Some way to hang your fabric: I used some magnets, but you could sew it around a PVC frame, or just tape it to a wall
  • LED Ring: 16 LED NeoPixel clone from AliExpress works well
  • Something to drive the LEDs: I used an Arduino I had lying around, but anything that can drive a NeoPixel works, such as this IR remote

Building it

green1

If you're using an Arduino to drive the LEDs, you should be able to hook up 5V, ground, and a data pin to the LED rings. A simple app using Adafruit's library:

#include <Adafruit_NeoPixel.h>

#define PIN        6 // On Trinket or Gemma, suggest changing this to 1
#define NUMPIXELS 16 // Popular NeoPixel ring size

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}

void loop() {
  pixels.clear(); // Set all pixel colors to 'off'
  for(int i=0; i<NUMPIXELS; i++) { // For each pixel...
    pixels.setPixelColor(i, pixels.Color(0, 30, 0));
    pixels.show();   // Send the updated pixel colors to the hardware.
  }
}

Place the ring around your webcam; I used some Velcro stickers so I can easily remove it.

green2

Hang up the fabric; it should be far enough away from your bike that it won't get in the way while you're riding, but close enough that you don't need to buy a ton of it. I ended up cutting the fabric to make two 3'x6' banners, and hanging on the ceiling with neodymium magnets.

green3

Chroma Key in OBS

Power the LEDs to a pure green. You can probaby run it at a low power; if you go too high you'll get some green on you, which isn't ideal. I have mine at 25% of max.

This can be set in OBS as a Filter on your webcam Source. You can play with the properties, but I was able to get by with the default values.

chroma-key

Then setup your stream layout. A decent placement is in the bottom left of the screen, Zwift doesn't put anything useful in there.

Happy Zwifting! Your FTP won't be any higher, but at least you'll look a little more stylish riding in Watopia.

All posts

I'm Matt Steele, a programmer living in Omaha, Nebraska. You can find me on GitHub and Twitter.