A Hysterical Woman

A Hysterical Woman is a performance piece by Rita Cheng and Akmyrat Tuyliyev. Inspired by both readings of late Victorian era feminist literature (particularly, The Yellow Wallpaper by Charlotte Perkins Gilman) and current political developments, the piece makes literal the fears of outspoken women.

Development

In development, the contents and idea of the piece shifted wildly from conception to execution. At first, we worked primarily off the text of The Yellow Wallpaper, conceiving several ways to make the story a video readymade– projecting onto the wall, a dollhouse, and even going as far as constructing a paper room onto which we projected wallpaper.

20170403_163727.jpg

However, our idea shifted radically with some supplemental readings. Because of Why I Teach the Yellow Wallpaper and Why I Wrote the Yellow Wallpaper, the project changed from a literal interpretation of the story’s setting into a piece that investigated how women’s health is used as a tool to silence.

We had wanted to use the Kinect to detect a person’s body to project a wandering womb onto, which was the Ancient Greek doctors’ conception of why women had ailments. Combining computer vision, the Kinect, and projection mapping is a difficult proposition. The easiest way seemed to be using the Kinect Projection Toolkit, if we wanted the software to detect new bodies without specific calibration. However, this approach had its own challenges, with a hefty setup process to install its many dependencies. Additionally, the whole setup was incompatible with Processing 3. Eventually, we abandoned this idea, but preliminary code for it can be seen below:

import gab.opencv.*;
import SimpleOpenNI.*;
import KinectProjectorToolkit.*;
import processing.video.*;
import processing.sound.*;
import ddf.minim.*;

AudioIn in;
Amplitude amp;
AudioPlayer coughs;
Minim minim;audio context

boolean talking = false;
boolean prevTalking = false;

SimpleOpenNI kinect;
OpenCV opencv;
KinectProjectorToolkit kpc;
ArrayList projectedContours;

Movie mov;
PImage top;
PImage bottom;
Movie movingUp;
Movie movingDown;
String status;

String path = "/media/";

void setup()
{
 size(250,400, P2D);
 size(displayWidth, displayHeight, P2D); 

 amp = new Amplitude(this);
 minim = new Minim(this);
 in = new AudioIn(this, 0);
 in.amp(0.5);
 in.play();
 amp.input(in);
 
 coughs = minim.loadFile(path + "cough.wav");


 setup Kinect
 kinect = new SimpleOpenNI(this); 
 kinect.enableDepth();
 kinect.enableUser();
 kinect.alternativeViewPointDepthToImage();
 
 setup OpenCV
 opencv = new OpenCV(this, kinect.depthWidth(), kinect.depthHeight());

 setup Kinect Projector Toolkit
 kpc = new KinectProjectorToolkit(this, kinect.depthWidth(), kinect.depthHeight());
 kpc.loadCalibration("calibration.txt");
 kpc.setContourSmoothness(4);
 
 bottom = loadImage(path + "bottom.jpg");
 movingUp = new Movie(this, path + "crawl.mov");
 movingDown = new Movie(this, path + "down.mov");
 top = loadImage(path + "top.jpg");
 status = "bottom";
 
 mov = movingUp;
 mov.loop();
}

void movieEvent(Movie m) {
 m.read();
}

void draw()
{ 
 prevTalking = talking;
 talking = (amp.analyze() > 0.01);
 
 if (mov.time() == mov.duration()) {
 if (mov == movingUp) {
 mov.stop();
 image(top, 0, 0);
 
 if (!coughs.isPlaying()) {
 coughs.cue(0);
 coughs.setVolume(1.0);
 coughs.loop();
 }
 status = "top";
 } else if (mov == movingDown) {
 mov.stop();
 image(bottom, 0, 0);
 status = "bottom";
 }
 } else if (talking != prevTalking) {
 if (status == "bottom") {
 mov = movingUp;
 mov.play();
 image(mov, 0, 0);
 status = "moving";
 } else if (status == "top") {
 mov = movingDown;
 mov.play();
 coughs.pause();
 image(mov, 0, 0);
 status = "moving";
 }
 }
 if (status == "bottom")
 image(bottom, 0, 0);

 kinect.update(); 
 kpc.setDepthMapRealWorld(kinect.depthMapRealWorld()); 
 kpc.setKinectUserImage(kinect.userImage());
 opencv.loadImage(kpc.getImage());
 
 get projected contours
 projectedContours = new ArrayList();
 ArrayList contours = opencv.findContours();
 for (Contour contour : contours) {
 if (contour.area() > 2000) {
 ArrayList cvContour = contour.getPoints();
 ProjectedContour projectedContour = kpc.getProjectedContour(cvContour, 1.0);
 projectedContours.add(projectedContour);
 }
 }
 
 draw projected contours
 background(0);
 for (int i=0; i<projectedContours.size(); i++) {
 ProjectedContour projectedContour = projectedContours.get(i);
 beginShape();
 texture(mov);
 for (PVector p : projectedContour.getProjectedContours()) {
 PVector t = projectedContour.getTextureCoordinate(p);
 vertex(p.x, p.y, mov.width * t.x, mov.height * t.y);
 }
 endShape();
 }
}

Without the interactive element, the piece became a singular performance of one Hysterical Woman.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s