Computer Vision

In Spring 2004, I took Computer Vision at Princeton University

Edge Detector
Using various techniques, we are able to produce an output image where lines in the output indicate edges in the original.
Image Quilting
Given a source texture, the image quilting algorithm allows us to create an arbitrarily large image resembling the same texture.
By projecting the image of a face onto a lower dimensional coordinate system defined from the SVD of a training set, we can recognize faces.
Using traffic cameras, we can automatically track the speed of passing traffic.

Advanced Computer Graphics

In Fall 2003, I took Advanced Computer Graphics at Princeton University.

Monte Carlo Path Tracer
To simulate the wide range of lighting conditions that are seen in nature, we implement a system that simulates light transport by tracing light paths through a scene. Rather than considering all possible paths of light, we use the Monte Carlo technique to randomly sample important paths, and use the results of sampling these paths as an approximation.

Lightfield Viewer
Rather than represent a scene by modeling object geometry, we can instead sample the lightfield, a function that measures the transport of light for various views of a scene independent of the underlying scene geometry, and interpolate to reconstruct arbitrary views. Sample data for the program can be found here.

Volume Viewer
In many scientific fields, especially medical imagery, volume datasets are very common. In this project, a friend and I implemented a simple, interactive volume rendering system.

Real-time Graphics Solutions

In Spring 2003, I was the Teaching Assistant for a class entitled Real-Time Interactive Computer Graphics. Essentially, it was a video game class where the students worked on some simple 2D games. I wrote several assignments for the class, which were quite detailed, and which I have listed here.

Motion Capture Assignments

Here are the writeups for some simple assignments in a Motion Capture class that I took at NYU in Spring 2003.

Color Tracking
Given an image of a person, we would like to know which pixels correspond to the person's skin, and which are background or clothes. This can be useful in tracking the position of a person's head or hands. We select a training sample of skin, to which we fit a Gaussian distribution, and use this distribution to predict if other pixels correspond to skin.

Optical Flow
In another tracking problem, we would like to determine (or at least approximate) the movement of some feature across the image, represented as the horizontal and vertical translation of some point. We use the well-known Lucas-Kanade optical-flow algorithm, which represents the problem as a minimization of a quadratic error function. We use the linear first derivative to approximate the minima, and use repeated searches until the error converges. This can be thought of as a form of Newton's method.

Fall 2002 Graphics Assignments

These are applets that I worked on for a Computer Graphics class at NYU in the Fall of 2002.

A simple drawing applet that demonstrates the basics of 2D graphics in Java.
Now that we can draw, we can also apply 2D linear transforms to a simple object.
Implements an OpenGL-like interface to display a 3D model, demonstrates loading and parsing a geometry file, controlling the scene with a virtual trackball, and performing the basic 3d rendering pipeline from transforms to lighting to rasterization.
Marble Mouse
A basic raytracer that uses Perlin Noise to acheive interesting texturing and lighting effects on sphere surfaces, and allows for interactive experimentation with aspects of the lighting equations and texturing.
Rocky Rodent
Extends Marble Mouse to include user-configurable bump-mapping based on the noise function, as well as multiple configurable lights and simple shadowing.
The Running Man
Demonstrates skeletal animation with forward kinematics by loading geometry and animation files
The Running Man 2 - Halloween Edition
Extends the previous example with rasterizing, smooth shading, lighting, texturing and z-buffered hidden surface removal.
Interactive Bezier splines
We generalize the previous assignment, which implemented smooth curves, to the second parametric dimension, thus implementing smooth surfaces.
For our last act, we model various dynamically-changing systems with a particle system simulator.