Petals on a Wet, Black Bough
The apparition of these faces in the crowd;
Petals on a wet, black bough.
—Ezra Pound, “In a Station of the Metro”
This project is an interactive dance installation projected on a series of four veils. It makes use of Kinect v1 to find the performer in the scene and give the impression they are interacting with a sea of pink petals.
By Chloe Karnezi
Concept
When reading Ezra Pound’s famous imagist poem, “In a Station o f the Metro” (1913) most, including myself, report visualising the petals mentioned as light pink.
The colour pink is central to this project. Each colour carries certain connotations in the public imagination, and pink is inextricably linked to gender stereotypes and traditional concepts of femininity. In the 18th century it became linked to tenderness and softness. This perception was popularised by the phrase “to see everything through rose-colored glasses,” as colour semiotician Michel Pastoureau explains in The Little Book of Color (2005).
I am interested in interrogating the widespread tendency to raise boys with an aversion to pink toys and clothes, as well as the problematic rejection of all things feminine, which this aversion to the colour implies. I also question the belief of a large number of Feminists that we must abandon pink and traditional modes of femininity in order to be taken seriously by society. Despite there being countless valid expressions of femininity, this project is a celebration of a particular type, linked to the colour pink, which I believe has been unjustly rebuffed.
Technical Implementation
Addons used:
ofxBox2D
ofxKinect
ofxOpenCV
ofxCV
ofxDelaunay
ofxGui
My aim was to create the effect of a silhouette dancing in a “sea” of petals using Kinect v1. I wanted the petals to interact with the silhouette.
In order to create the system of particles that comprise the sea of petals for this interaction I used the physics simulator engine Box2D.
The challenge can be broken up into two parts:
Part1: Create a contour of the silhouette from the images acquired from the Kinect.
Part2: Create the petals as Box2D objects and also create a Box2D edge from the contour, so that the petals interact with the contour.
Part 1:
I tried two methods to get the contour:
First method: By doing background differencing (learning a background and then getting the thresholded difference from the subsequent images).
Second method: Using the Kinect near and far threshold images and getting the difference. In both cases I was looking for one blob only (my silhouette).
Part 2.
To create the petals:
I created a Box2D world and a Box2D ParticleSystem to represent the petals. I based my ParticleSystem on the “example-ParticleSystem” of Box2D (https://github.com/vanderlin/ofxBox2d/tree/master/example-ParticleSystem)
In order to have the effect of a continuous downwards flow of petals I had to create additional particles falling from the top of the window. But continuously adding new particles to the Box2D world made the program too slow. To solve this, at each frame I check and remove such particles that have reached the ground level and then add an equal number of particles which start falling from the top.
For the box2D edge:
After I get hold of the contour with (ofxCvContourFinder), I create a closed Polyline from the contour points (contour.blobs[0].pts). I then pass this polyline as vertices to be added to the Box2dEdge and I create a new Box2dEdge.
This Edge interacts properly with the particles bouncing off of the edge.
The problem was that this box2dEdge does not stop the particles from entering the contour, where once entered, they remain. It’s as if it doesn’t stop them from going in but at the same time it doesn’t allow them to come out. So the particles are essentially “trapped” inside the contour.
I then attempted to use the Delaunay addon to add triangles to cover all the blob area, and then add those triangles to the Box2d world. In theory the particles would not be able to enter the contour.
I tried the triangulation with the contour vertices. Then all the triangles’ vertices were passed to box2d and a vector of box2d triangles was created. In order to get the triangles’ vertices I tried both the function provided by Theo and Delaunay addons own function, but unfortunately this did not seem to work either. The petals/particles don’t interact with the triangles and still enter the contour.
To make sure the box2d triangles don’t fall to the ground as a result of gravity, I created them as static objects (density 0.0). I also had them drawn and I verified that indeed they stay in the contour and do not fall.
Another problem was that Delaunay triangulation creates triangles of all the contour points which means that when I lift my hand, I get triangles between my raised hand and my head.
My next attempt was to try to remove any particle that enters the blob area.
One solution was to remove a particle if the value of the underlying pixel is 255 (which means the particle is in the blob area).
Next I tried to use the ofxCV addon, and use the ofxCv::ContourFinder to get the contour and then use the ofxCV function pointPolygonTest to determine which particles are inside the blob and need to be removed.
The problem with this is that unlike the ofxCvContourFinder, ofxCv::ContourFinder does not allow to look for only one blob. So when calling the pointPolygonTest function if multiple blobs are identified one cannot be certain which blob to pass it. The ofxCvContourFinder on the other hand, allows to search for just one blob but does not have a pointPolygonTest function.
All in all this project presented many challenges which I did my best to combat with roundabout methods in order to achieve an ultimately satisfactory visual result.
References
Music in performance videos by Blue Dot Sessions.
My code made use of a function written by Theo Papatheodorou - vector
Simonnet, Dominique, and Michel Pastoureau. The Little Book of Color. Editions Du Panama, 2005.