I implemented a simple algorithm for doing face morphs between two images (A and B) with correspondence points:

Lerp the correspondence points from each image together

Compute a Delaunay triangulation of the lerped points

For each triangle, compute the affine transformation matrix to transform from each triangle in the lerped pointset to the corresponding triangle in the original pointset.

For each image, produce an output image: for each pixel, look up which triangle (in the lerp pointset) the pixel is in, do the affine transformation for that triangle, and pick that pixel from the original image.

Lerp the two output images together to produce the final image.

Next, I blended my face with my roommate's face using this algorithm:

I took the Danish face dataset and computed the average face, average male face, and average female face.

The process is very simple: average all of the correspondence points together to compute the average shape, warp each face to the average shape, and do a simple average of all of the warped image.

Interestingly enough, each individual warped face looks terrible, but the average is extremely visually appealing.

Finally, I took my face and warped it to the average Danish shape, and I took the average Danish face and warped it to my shape. Both results are disturbing.

I used the average male Danish face computed in the previous part to create a caricature of myself, by taking my face and extrapolating the shape from the average Danish shape, past my own face shape.

I created another morph sequence, just of my face, from the average Danish face (t = 0.0), to my face (t = 1.0), to my extrapolated face (t = 1.5):

I participated in a 23-person face morph: we each cropped our face to the same general cropping, defined correspondance points,
and then ran our algorithm to generate 45 frames of morphing from the previous person in the sequence to us.