I encountered quite a challenge with my chin's morphing to Dash's because the triangles became too thin and would visibly splinter upon intermediate warps. This is simply because I could not include more of my body in the photo without vertically squishing it first since my head is taller than Dash's. Not including correspondences for the chin resolved this but made my chin stretch to about my neck's length. This was not an issue in the Flerkel morph.
Defining Correspondences
I made a program that allows a user to select corresponding points between two images in order. This part was especially difficult because the correspondences kept getting corrupted, which I diagnosed the cause of by taking only one correspondence at a time and then replotting all previous correspondences each time I would take a new one to see when the points moved. It turned out to be an issue with my computer's trackpad sporadically double-clicking. After such a headache, I, of course, saved these correspondences to a file.
|
|
|
|
|
55
|
55
|
55
|
56
|
56
|
56
|
Computing the Mid-Way Face
I calculated the average of every correspondence (pair of points between images) and computed a Delaunay triangulation for those average points. I used that same triangulation for the other two sets of points to ensure triangles would match up. I then interpolated over the R,G,B
bands in images to have sensible values for intermediate pixels. I went on to iterate over the Delaunay triangles and compute an affine transformation between each of those and each triangle in each image. Within each iteration, I would compute all the points within that triangle and iterate over those to calculate the spatial transformation for that pixel and assign it the appropriate color values from the interpolation function.
104
|
104
|
104
|
106
|
106
|
106
|
|
|
|
|
|
|
The Morph Sequence
I created a morph of 45 frames at 30 frames per second using much of the same technique from the previous section, only adding a morph fraction and dissolve fraction. The morph fraction is used to calculate the points to warp to in each iteration by multiplying the first image's points by 1 - warp fraction
and the second image's by warp fraction
and adding the results. The dissolve fraction is used in the same way to weight the interpolation values. I set both to be the current iteration divided by the total number of frames.
|
|
The Mean Face of a Sample
I used 50 of the 200 images of non-smiling people from the FEI Face Database to compute the mean on. I used these photos because they most closely match my expression in my own photo and only these are prelabeled with correspondences. My code was essentially the same as before but now allowing the mean to be calculated over any number of images.
|
|
|
|
94
|
94
|
104
|
|
|
|
|
|
|
Caricatures
I extrapolated from the mean face to accentuate my features.
|
.3
|
.9
|
-.3
|
-.9
|
Morphing Dogs
For my bell and whistle, I morphed two dogs.
|
|
|