Coder Social home page Coder Social logo

yann-papouin / warp-and-blend-quadros Goto Github PK

View Code? Open in Web Editor NEW

This project forked from errollw/warp-and-blend-quadros

0.0 2.0 0.0 764 KB

NVAPI warping and blending for Rainbow Group display wall

C++ 69.96% C 15.25% HTML 0.25% JavaScript 14.44% Python 0.10%

warp-and-blend-quadros's Introduction

Warping and Blending using NVAPI

This project hosts the code for warping and blending our tiled projector display wall in the Rainbow Laboratory at the Cambridge Computer Lab. We use Nvidia’s GPU utilities and programming interface (NVAPI) to avoid struggling with many issues faced by past multi-projector deployments.

Image of our display wall

Projector hardware

Our design uses six BenQ W1400 commodity-level projectors (1920×1080px each) providing a maximum resolution of 12.4 megapixels. Our screen is sized at 4×1.5m, so users can get up to 2.5m close to the screen without being able to discern individual pixels. The projectors are arranged in a 3×2 configuration, and mounted under horizontal scaffolding beams attached to the ceiling. Our projector models are short-throw, the closest ones are 1.45m away from the screen so users can approach the display without creating unwanted shadows. They also feature off-axis projection and lens-shift, allowing them to be placed 2m high without experiencing serious perspective distortion.

They are driven by a Windows 8.1 PC with two quad-core 1.80GHz Intel Xeon E5-2603 processors, two NVIDIA Quadro K5000 GPUs, and 16GB RAM. Our display uses this specialist hardware to appear as a single screen to the operating system, avoiding multiple-display issues.

Projector calibration

In multi-projector setups, there are two common calibration steps required to make a seamless displays:

  1. Warping - The displays must be aligned so projected regions cover the desired area without distortion .
  2. Blending - Intensity correction must be applied to overlapping regions to avoid illumination irregularities.

We chose manual calibration to avoid additional hardware and system complexity. Using the calibration utility util\calibrate_screens.html, users manually transform and align six on-screen quadrilaterals using keyboard and mouse. This then outputs transform coordinates for each projector that can be used for warping and blending.

The blending textures are generated with warp_blending_mask.py and OpenCV. We first calculate the homography between an unwarped rectangle and the warped projected quadrilateral, and then perform a perspective warp on an unwarped blending mask.

NVIDIA API usage

Nvidia Mosaic is a utility that allows the operating system to view multiple displays as a single unified desktop environment without degrading performance or needing to modify third-party software. It also allows users to specify projector overlap regions so the desktop display transitions seamlessly over the entire display without discontinuities.

NVAPI Quadro Warp/Blend lets us warp displays with a warping mesh to remove keystone distortion. In our case, each projected display has a quadrilateral warping mesh. These transformations are done in the display pipeline before pixels are scanned out, and leverage GPU hardware to perform fast high-quality image filtering operations. It also allows a blending texture to be loaded and applied to each display which modifies the output intensity of each pixel.

warp-and-blend-quadros's People

Contributors

errollw avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.