Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Comparing changes

Choose two branches to see what's changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base fork: julescarbon/styleblaster
...
head fork: julescarbon/styleblaster
Checking mergeability… Don't worry, you can still create the pull request.
  • 4 commits
  • 208 files changed
  • 0 commit comments
  • 2 contributors
Showing with 12,988 additions and 136 deletions.
  1. +0 −1  README
  2. +49 −30 processing/StyleBlasterGrabber/StyleBlasterGrabber.pde
  3. +89 −0 processing/StyleBlasterGrabber/applet/MotionSensor.pde
  4. +423 −0 processing/StyleBlasterGrabber/applet/OpticalFlow.pde
  5. BIN  processing/StyleBlasterGrabber/applet/StyleBlasterGrabber.jar
  6. +847 −0 processing/StyleBlasterGrabber/applet/StyleBlasterGrabber.java
  7. +274 −0 processing/StyleBlasterGrabber/applet/StyleBlasterGrabber.pde
  8. BIN  processing/StyleBlasterGrabber/applet/core.jar
  9. BIN  processing/StyleBlasterGrabber/applet/gifAnimation.jar
  10. +208 −0 processing/StyleBlasterGrabber/applet/index.html
  11. BIN  processing/StyleBlasterGrabber/applet/loading.gif
  12. BIN  processing/StyleBlasterGrabber/applet/opengl.jar
  13. BIN  processing/StyleBlasterGrabber/applet/postToWeb.jar
  14. +29 −0 processing/StyleBlasterGrabber/applet/timer.pde
  15. BIN  processing/StyleBlasterGrabber/applet/video.jar
  16. BIN  processing/StyleBlasterGrabber/application.linux32/lib/StyleBlasterGrabber.jar
  17. +20 −17 processing/StyleBlasterGrabber/application.linux32/source/StyleBlasterGrabber.pde
  18. +1 −0  processing/StyleBlasterGrabber/application.linux32/source/timer.pde
  19. BIN  processing/StyleBlasterGrabber/application.linux64/lib/StyleBlasterGrabber.jar
  20. +20 −17 processing/StyleBlasterGrabber/application.linux64/source/StyleBlasterGrabber.pde
  21. +1 −0  processing/StyleBlasterGrabber/application.linux64/source/timer.pde
  22. +1 −1  processing/StyleBlasterGrabber/application.macosx/StyleBlasterGrabber.app/Contents/Info.plist
  23. BIN  ...leBlasterGrabber/application.macosx/StyleBlasterGrabber.app/Contents/Resources/Java/StyleBlasterGrabber.jar
  24. +20 −17 processing/StyleBlasterGrabber/application.macosx/source/StyleBlasterGrabber.pde
  25. +1 −0  processing/StyleBlasterGrabber/application.macosx/source/timer.pde
  26. BIN  processing/StyleBlasterGrabber/application.windows32/lib/StyleBlasterGrabber.jar
  27. +1 −1  processing/StyleBlasterGrabber/application.windows32/lib/args.txt
  28. +21 −17 processing/StyleBlasterGrabber/application.windows32/source/StyleBlasterGrabber.java
  29. +20 −17 processing/StyleBlasterGrabber/application.windows32/source/StyleBlasterGrabber.pde
  30. +1 −0  processing/StyleBlasterGrabber/application.windows32/source/timer.pde
  31. BIN  processing/StyleBlasterGrabber/application.windows64/lib/StyleBlasterGrabber.jar
  32. +1 −1  processing/StyleBlasterGrabber/application.windows64/lib/args.txt
  33. +20 −17 processing/StyleBlasterGrabber/application.windows64/source/StyleBlasterGrabber.pde
  34. +1 −0  processing/StyleBlasterGrabber/application.windows64/source/timer.pde
  35. +1 −0  processing/StyleBlasterGrabber/timer.pde
  36. +89 −0 processing/StyleBlasterGrabber2_0/MotionSensor.pde
  37. +417 −0 processing/StyleBlasterGrabber2_0/OpticalFlow.pde
  38. +279 −0 processing/StyleBlasterGrabber2_0/StyleBlasterGrabber2_0.pde
  39. +4 −0 processing/StyleBlasterGrabber2_0/application.linux32/StyleBlasterGrabber
  40. BIN  processing/StyleBlasterGrabber2_0/application.linux32/lib/StyleBlasterGrabber.jar
  41. BIN  processing/StyleBlasterGrabber2_0/application.linux32/lib/core.jar
  42. BIN  processing/StyleBlasterGrabber2_0/application.linux32/lib/gifAnimation.jar
  43. BIN  processing/StyleBlasterGrabber2_0/application.linux32/lib/gluegen-rt.jar
  44. BIN  processing/StyleBlasterGrabber2_0/application.linux32/lib/jogl.jar
  45. BIN  processing/StyleBlasterGrabber2_0/application.linux32/lib/opengl.jar
  46. BIN  processing/StyleBlasterGrabber2_0/application.linux32/lib/postToWeb.jar
  47. BIN  processing/StyleBlasterGrabber2_0/application.linux32/lib/video.jar
  48. BIN  processing/StyleBlasterGrabber2_0/application.linux32/libgluegen-rt.so
  49. BIN  processing/StyleBlasterGrabber2_0/application.linux32/libjogl.so
  50. BIN  processing/StyleBlasterGrabber2_0/application.linux32/libjogl_awt.so
  51. BIN  processing/StyleBlasterGrabber2_0/application.linux32/libjogl_cg.so
  52. +89 −0 processing/StyleBlasterGrabber2_0/application.linux32/source/MotionSensor.pde
  53. +423 −0 processing/StyleBlasterGrabber2_0/application.linux32/source/OpticalFlow.pde
  54. +283 −0 processing/StyleBlasterGrabber2_0/application.linux32/source/StyleBlasterGrabber.pde
  55. +28 −0 processing/StyleBlasterGrabber2_0/application.linux32/source/timer.pde
  56. +4 −0 processing/StyleBlasterGrabber2_0/application.linux64/StyleBlasterGrabber
  57. BIN  processing/StyleBlasterGrabber2_0/application.linux64/lib/StyleBlasterGrabber.jar
  58. BIN  processing/StyleBlasterGrabber2_0/application.linux64/lib/core.jar
  59. BIN  processing/StyleBlasterGrabber2_0/application.linux64/lib/gifAnimation.jar
  60. BIN  processing/StyleBlasterGrabber2_0/application.linux64/lib/gluegen-rt.jar
  61. BIN  processing/StyleBlasterGrabber2_0/application.linux64/lib/jogl.jar
  62. BIN  processing/StyleBlasterGrabber2_0/application.linux64/lib/opengl.jar
  63. BIN  processing/StyleBlasterGrabber2_0/application.linux64/lib/postToWeb.jar
  64. BIN  processing/StyleBlasterGrabber2_0/application.linux64/lib/video.jar
  65. BIN  processing/StyleBlasterGrabber2_0/application.linux64/libgluegen-rt.so
  66. BIN  processing/StyleBlasterGrabber2_0/application.linux64/libjogl.so
  67. BIN  processing/StyleBlasterGrabber2_0/application.linux64/libjogl_awt.so
  68. BIN  processing/StyleBlasterGrabber2_0/application.linux64/libjogl_cg.so
  69. +89 −0 processing/StyleBlasterGrabber2_0/application.linux64/source/MotionSensor.pde
  70. +423 −0 processing/StyleBlasterGrabber2_0/application.linux64/source/OpticalFlow.pde
  71. +283 −0 processing/StyleBlasterGrabber2_0/application.linux64/source/StyleBlasterGrabber.pde
  72. +28 −0 processing/StyleBlasterGrabber2_0/application.linux64/source/timer.pde
  73. BIN  processing/StyleBlasterGrabber2_0/application.windows32/StyleBlasterGrabber.exe
  74. BIN  processing/StyleBlasterGrabber2_0/application.windows32/gluegen-rt.dll
  75. BIN  processing/StyleBlasterGrabber2_0/application.windows32/jogl.dll
  76. BIN  processing/StyleBlasterGrabber2_0/application.windows32/jogl_awt.dll
  77. BIN  processing/StyleBlasterGrabber2_0/application.windows32/jogl_cg.dll
  78. BIN  processing/StyleBlasterGrabber2_0/application.windows32/lib/StyleBlasterGrabber.jar
  79. +3 −0  processing/StyleBlasterGrabber2_0/application.windows32/lib/args.txt
  80. BIN  processing/StyleBlasterGrabber2_0/application.windows32/lib/core.jar
  81. BIN  processing/StyleBlasterGrabber2_0/application.windows32/lib/gifAnimation.jar
  82. BIN  processing/StyleBlasterGrabber2_0/application.windows32/lib/gluegen-rt.jar
  83. BIN  processing/StyleBlasterGrabber2_0/application.windows32/lib/jogl.jar
  84. BIN  processing/StyleBlasterGrabber2_0/application.windows32/lib/opengl.jar
  85. BIN  processing/StyleBlasterGrabber2_0/application.windows32/lib/postToWeb.jar
  86. BIN  processing/StyleBlasterGrabber2_0/application.windows32/lib/video.jar
  87. +89 −0 processing/StyleBlasterGrabber2_0/application.windows32/source/MotionSensor.pde
  88. +423 −0 processing/StyleBlasterGrabber2_0/application.windows32/source/OpticalFlow.pde
  89. +855 −0 processing/StyleBlasterGrabber2_0/application.windows32/source/StyleBlasterGrabber.java
  90. +283 −0 processing/StyleBlasterGrabber2_0/application.windows32/source/StyleBlasterGrabber.pde
  91. +28 −0 processing/StyleBlasterGrabber2_0/application.windows32/source/timer.pde
  92. BIN  processing/StyleBlasterGrabber2_0/application.windows64/StyleBlasterGrabber.exe
  93. BIN  processing/StyleBlasterGrabber2_0/application.windows64/gluegen-rt.dll
  94. BIN  processing/StyleBlasterGrabber2_0/application.windows64/jogl.dll
  95. BIN  processing/StyleBlasterGrabber2_0/application.windows64/jogl_awt.dll
  96. BIN  processing/StyleBlasterGrabber2_0/application.windows64/jogl_cg.dll
  97. BIN  processing/StyleBlasterGrabber2_0/application.windows64/lib/StyleBlasterGrabber.jar
  98. +3 −0  processing/StyleBlasterGrabber2_0/application.windows64/lib/args.txt
  99. BIN  processing/StyleBlasterGrabber2_0/application.windows64/lib/core.jar
  100. BIN  processing/StyleBlasterGrabber2_0/application.windows64/lib/gifAnimation.jar
  101. BIN  processing/StyleBlasterGrabber2_0/application.windows64/lib/gluegen-rt.jar
  102. BIN  processing/StyleBlasterGrabber2_0/application.windows64/lib/jogl.jar
  103. BIN  processing/StyleBlasterGrabber2_0/application.windows64/lib/opengl.jar
  104. BIN  processing/StyleBlasterGrabber2_0/application.windows64/lib/postToWeb.jar
  105. BIN  processing/StyleBlasterGrabber2_0/application.windows64/lib/video.jar
  106. +89 −0 processing/StyleBlasterGrabber2_0/application.windows64/source/MotionSensor.pde
  107. +423 −0 processing/StyleBlasterGrabber2_0/application.windows64/source/OpticalFlow.pde
  108. +283 −0 processing/StyleBlasterGrabber2_0/application.windows64/source/StyleBlasterGrabber.pde
  109. +28 −0 processing/StyleBlasterGrabber2_0/application.windows64/source/timer.pde
  110. +6 −0 processing/StyleBlasterGrabber2_0/readme.textile
  111. +28 −0 processing/StyleBlasterGrabber2_0/timer.pde
  112. +89 −0 processing/StyleBlasterGrabber_Mexico/MotionSensor.pde
  113. +423 −0 processing/StyleBlasterGrabber_Mexico/OpticalFlow.pde
  114. +292 −0 processing/StyleBlasterGrabber_Mexico/StyleBlasterGrabber_Mexico.pde
  115. +4 −0 processing/StyleBlasterGrabber_Mexico/application.linux32/StyleBlasterGrabber_Mexico
  116. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/lib/StyleBlasterGrabber_Mexico.jar
  117. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/lib/core.jar
  118. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/lib/gifAnimation.jar
  119. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/lib/gluegen-rt.jar
  120. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/lib/jogl.jar
  121. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/lib/opengl.jar
  122. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/lib/postToWeb.jar
  123. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/lib/video.jar
  124. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/libgluegen-rt.so
  125. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/libjogl.so
  126. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/libjogl_awt.so
  127. BIN  processing/StyleBlasterGrabber_Mexico/application.linux32/libjogl_cg.so
  128. +89 −0 processing/StyleBlasterGrabber_Mexico/application.linux32/source/MotionSensor.pde
  129. +423 −0 processing/StyleBlasterGrabber_Mexico/application.linux32/source/OpticalFlow.pde
  130. +292 −0 processing/StyleBlasterGrabber_Mexico/application.linux32/source/StyleBlasterGrabber_Mexico.pde
  131. +29 −0 processing/StyleBlasterGrabber_Mexico/application.linux32/source/timer.pde
  132. +4 −0 processing/StyleBlasterGrabber_Mexico/application.linux64/StyleBlasterGrabber_Mexico
  133. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/lib/StyleBlasterGrabber_Mexico.jar
  134. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/lib/core.jar
  135. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/lib/gifAnimation.jar
  136. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/lib/gluegen-rt.jar
  137. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/lib/jogl.jar
  138. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/lib/opengl.jar
  139. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/lib/postToWeb.jar
  140. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/lib/video.jar
  141. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/libgluegen-rt.so
  142. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/libjogl.so
  143. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/libjogl_awt.so
  144. BIN  processing/StyleBlasterGrabber_Mexico/application.linux64/libjogl_cg.so
  145. +89 −0 processing/StyleBlasterGrabber_Mexico/application.linux64/source/MotionSensor.pde
  146. +423 −0 processing/StyleBlasterGrabber_Mexico/application.linux64/source/OpticalFlow.pde
  147. +292 −0 processing/StyleBlasterGrabber_Mexico/application.linux64/source/StyleBlasterGrabber_Mexico.pde
  148. +29 −0 processing/StyleBlasterGrabber_Mexico/application.linux64/source/timer.pde
  149. +75 −0 processing/StyleBlasterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Info.plist
  150. BIN  ...eBlasterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/MacOS/JavaApplicationStub
  151. BIN  ...lasterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/MacOS/JavaApplicationStub64
  152. +1 −0  processing/StyleBlasterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/PkgInfo
  153. BIN  ...co/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/StyleBlasterGrabber_Mexico.jar
  154. BIN  ...yleBlasterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/core.jar
  155. BIN  ...erGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/gifAnimation.jar
  156. BIN  ...sterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/gluegen-rt.jar
  157. BIN  ...yleBlasterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/jogl.jar
  158. BIN  ...abber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/libgluegen-rt.jnilib
  159. BIN  ...sterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/libjogl.jnilib
  160. BIN  ...Grabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/libjogl_awt.jnilib
  161. BIN  ...rGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/libjogl_cg.jnilib
  162. BIN  ...eBlasterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/opengl.jar
  163. BIN  ...asterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/postToWeb.jar
  164. BIN  ...leBlasterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/Java/video.jar
  165. BIN  ...StyleBlasterGrabber_Mexico/application.macosx/StyleBlasterGrabber_Mexico.app/Contents/Resources/sketch.icns
  166. +89 −0 processing/StyleBlasterGrabber_Mexico/application.macosx/source/MotionSensor.pde
  167. +423 −0 processing/StyleBlasterGrabber_Mexico/application.macosx/source/OpticalFlow.pde
  168. +292 −0 processing/StyleBlasterGrabber_Mexico/application.macosx/source/StyleBlasterGrabber_Mexico.pde
  169. +29 −0 processing/StyleBlasterGrabber_Mexico/application.macosx/source/timer.pde
  170. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/StyleBlasterGrabber_Mexico.exe
  171. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/gluegen-rt.dll
  172. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/jogl.dll
  173. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/jogl_awt.dll
  174. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/jogl_cg.dll
  175. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/lib/StyleBlasterGrabber_Mexico.jar
  176. +3 −0  processing/StyleBlasterGrabber_Mexico/application.windows32/lib/args.txt
  177. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/lib/core.jar
  178. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/lib/gifAnimation.jar
  179. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/lib/gluegen-rt.jar
  180. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/lib/jogl.jar
  181. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/lib/opengl.jar
  182. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/lib/postToWeb.jar
  183. BIN  processing/StyleBlasterGrabber_Mexico/application.windows32/lib/video.jar
  184. +89 −0 processing/StyleBlasterGrabber_Mexico/application.windows32/source/MotionSensor.pde
  185. +423 −0 processing/StyleBlasterGrabber_Mexico/application.windows32/source/OpticalFlow.pde
  186. +865 −0 processing/StyleBlasterGrabber_Mexico/application.windows32/source/StyleBlasterGrabber_Mexico.java
  187. +292 −0 processing/StyleBlasterGrabber_Mexico/application.windows32/source/StyleBlasterGrabber_Mexico.pde
  188. +29 −0 processing/StyleBlasterGrabber_Mexico/application.windows32/source/timer.pde
  189. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/StyleBlasterGrabber_Mexico.exe
  190. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/gluegen-rt.dll
  191. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/jogl.dll
  192. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/jogl_awt.dll
  193. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/jogl_cg.dll
  194. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/lib/StyleBlasterGrabber_Mexico.jar
  195. +3 −0  processing/StyleBlasterGrabber_Mexico/application.windows64/lib/args.txt
  196. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/lib/core.jar
  197. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/lib/gifAnimation.jar
  198. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/lib/gluegen-rt.jar
  199. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/lib/jogl.jar
  200. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/lib/opengl.jar
  201. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/lib/postToWeb.jar
  202. BIN  processing/StyleBlasterGrabber_Mexico/application.windows64/lib/video.jar
  203. +89 −0 processing/StyleBlasterGrabber_Mexico/application.windows64/source/MotionSensor.pde
  204. +423 −0 processing/StyleBlasterGrabber_Mexico/application.windows64/source/OpticalFlow.pde
  205. +292 −0 processing/StyleBlasterGrabber_Mexico/application.windows64/source/StyleBlasterGrabber_Mexico.pde
  206. +29 −0 processing/StyleBlasterGrabber_Mexico/application.windows64/source/timer.pde
  207. +6 −0 processing/StyleBlasterGrabber_Mexico/readme.textile
  208. +29 −0 processing/StyleBlasterGrabber_Mexico/timer.pde
View
1  README
@@ -1,4 +1,3 @@
-HOW TO BLAST
So, you want to join the Styleblaster Network?
Camera setup instructions:
View
79 processing/StyleBlasterGrabber/StyleBlasterGrabber.pde
@@ -10,7 +10,7 @@ Capture sensor;
Timer cameraTimer, sensorTimer;
int numPixels;
boolean blast; //turns photo-taking on or off
-boolean ignoreSensor = true;
+boolean ignoreSensor = false;
boolean debug = false;
boolean uploading = false;
boolean checkRight = false;
@@ -23,13 +23,14 @@ byte[] imgBytes;
PImage grabImage;
//GifMaker gifExport;
-MotionSensor leftSensor, rightSensor;
+MotionSensor motionSensor;
//SETUP VARS
String version = "1.5";
int startHour = 7; //am
int endHour = 16; //3:59pm
int endMinute = 25;
+<<<<<<< HEAD
int sensorBuffer = -220;
int sensorBufferY = 50;
@@ -43,10 +44,14 @@ String devUploadURL = "http://styleblaster.herokuapp.com/upload/dev";
String uploadURL = nycUploadURL;
String tag = "nyc";
+=======
+String uploadURL = "http://styleblaster.herokuapp.com/upload";
+>>>>>>> master
int camWidth;
int camHeight = 720;
int sensorThreshold = 13;
-int flowThreshold = -220;
+int flowDirection = -1; //-1 = right to left, 1 = left to right
+int flowThreshold = 220;
float sensorRes = 1;
public void setup() {
@@ -89,8 +94,13 @@ public void setup() {
sensorTimer = new Timer(1000);
//initialize the hit areas
- leftSensor = new MotionSensor();
- rightSensor = new MotionSensor();
+ motionSensor = new MotionSensor();
+ //initialize sensor position
+ motionSensor._r.width = 20;
+ motionSensor._r.height = 20;
+ motionSensor._r.x = width/2 - motionSensor._r.width/2;
+ motionSensor._r.y = height * 2/3;
+ motionSensor.update();
of = new OpticalFlow(cam);
@@ -113,14 +123,14 @@ void draw() {
if (mousePressed) {
rectMode(CORNER);
- leftSensor._bDiff = 0;
+ motionSensor._bDiff = 0;
ignoreSensor = true;
- int sensorWidth = round((mouseX - leftSensor._r.x));
- int sensorHeight = mouseY - leftSensor._r.y;
- leftSensor._r.width = sensorWidth;
- leftSensor._r.height = sensorHeight;
+ int sensorWidth = round((mouseX - motionSensor._r.x));
+ int sensorHeight = mouseY - motionSensor._r.y;
+ motionSensor._r.width = sensorWidth;
+ motionSensor._r.height = sensorHeight;
- leftSensor.update();
+ motionSensor.update();
blast = false;
}
@@ -138,7 +148,7 @@ void draw() {
}
else {
if (grab) {
- println("!!!HIT!!! @ : "+rightSensor._bDiff);
+ println("!!!HIT!!! @ : ");
fill(255, 0, 0);
onHit();
}
@@ -156,8 +166,7 @@ void draw() {
//date
text(getTimestamp(), 5, 15);
- leftSensor.draw();
- rightSensor.draw();
+ motionSensor.draw();
fill(255);
text("threshold: "+sensorThreshold, 5, height-5);
@@ -170,8 +179,11 @@ void draw() {
boolean hit = false;
grab = false;
//update the reference image on the sensors
- leftSensor._image = grabImage;
+ motionSensor._image = grabImage;
+
+ //GIF EXPORT*********START
if (doGifs){
+
if (of.xFlowSum < flowThreshold) {
if (!recordGif) {
// gifExport = new GifMaker(this, getTimestamp()+".gif");
@@ -188,12 +200,22 @@ void draw() {
recordGif = false;
// gifExport = new GifMaker(this, "export.gif");
}}
+//GIF EXPORT**********END
- hit = leftSensor.checkHitArea();
+ hit = motionSensor.checkHitArea();
if (hit) {
- leftSensor.reset();
-
- if (of.xFlowSum < flowThreshold) {
+ motionSensor.reset();
+ boolean dir = false;
+ if(flowDirection == -1){
+ //right to left
+ dir = of.xFlowSum < flowThreshold*flowDirection;
+ }
+ else{
+ //left to right
+ dir = of.xFlowSum > flowThreshold;
+ }
+
+ if (dir) {
grab = true;
}
}
@@ -201,16 +223,11 @@ void draw() {
}
void mousePressed() {
- leftSensor._r.x = mouseX;
- leftSensor._r.y = mouseY;
- // rightSensor._r.x = mouseX+rightSensor._r.width;
- // rightSensor._r.y = mouseY;
- // rightSensor._r.y = mouseY+sensorBufferY;
+ motionSensor._r.x = mouseX;
+ motionSensor._r.y = mouseY;
ignoreSensor = true;
}
-
-
void onHit() {
//IS THE CAMERA TIMER NEEDED HERE?
if (cameraTimer.isFinished()) {
@@ -280,21 +297,23 @@ void keyPressed() {
else if (key == '.') {
//increase the threshold
sensorThreshold += 1;
- leftSensor._thresh = sensorThreshold;
- rightSensor._thresh = sensorThreshold;
+ motionSensor._thresh = sensorThreshold;
}
else if (key == ',') {
//increase the threshold
sensorThreshold -= 1;
- leftSensor._thresh = sensorThreshold;
- rightSensor._thresh = sensorThreshold;
+ motionSensor._thresh = sensorThreshold;
}
else if (key=='w') of.flagseg=!of.flagseg; // segmentation on/off
else if (key=='s') of.flagsound=!of.flagsound; // sound on/off
else if (key=='m') of.flagmirror=!of.flagmirror; // mirror on/off
else if (key=='f') of.flagflow=!of.flagflow; // show opticalflow on/off
+<<<<<<< HEAD
else if (key=='d') disable=!disable; // show opticalflow on/off
else if (key=='v') production=!production; // send to production endpoint
+=======
+ else if (key=='d') disable=!disable; // disable/enable
+>>>>>>> master
}
View
89 processing/StyleBlasterGrabber/applet/MotionSensor.pde
@@ -0,0 +1,89 @@
+import java.awt.Rectangle;
+import processing.video.*;
+
+
+class MotionSensor {
+ Rectangle _r = new Rectangle(0, 0, 0, 0);
+ int _thresh = 13;
+ float _sensorRes = 1;
+ float _lastTestAreaBrightness, _bDiff;
+ int _numPixels;
+ PImage _image;
+ // Capture _cam;
+
+ MotionSensor() {
+
+ }
+
+ boolean checkHitArea() {
+ // _cam = cam;
+ float testAreaBrightness = getTestAreaBrightness();
+ //find teh absolute diff of the current brightness and the last brightness
+ //println("testAreaBrightness: "+testAreaBrightness);
+ // println("_lastTestAreaBrightness: "+_lastTestAreaBrightness);
+ _bDiff = abs(testAreaBrightness - _lastTestAreaBrightness);
+
+ _lastTestAreaBrightness = testAreaBrightness;
+
+ if (_bDiff > _thresh) {
+ return true;
+ }
+ return false;
+ }
+
+ //returns the average brightness of the test area defined by the test area rectangle
+ float getTestAreaBrightness() {
+ _image.loadPixels();
+ float testAreaBrightness = 0;
+
+ // For each pixel in the test area
+ for (int x = _r.x; x < _r.x+_r.width; x+=_sensorRes) {
+ for (int y = _r.y; y < _r.y+_r.height; y+=_sensorRes) {
+ // println("_cam.get(x, y): "+ _cam.get(x, y));
+ testAreaBrightness += brightness(_image.get(x, y));
+ // println("brightness(_cam.get(x, y): "+ brightness(_cam.get(x, y)));
+ }
+ }
+
+ testAreaBrightness /= _numPixels;
+ testAreaBrightness *= _sensorRes;
+
+ return testAreaBrightness;
+ }
+
+ void draw() {
+ // println("MotionSensor.draw");
+ rect(_r.x, _r.y, _r.width, _r.height);
+ text(_bDiff, _r.x, _r.y - 5);
+ }
+
+ void update() {
+ _numPixels = _r.width*_r.height;
+ }
+
+ void reset(){
+ float testAreaBrightness = getTestAreaBrightness();
+ _bDiff = abs(testAreaBrightness - _lastTestAreaBrightness);
+ _lastTestAreaBrightness = testAreaBrightness;
+ }
+
+ //GETTERS AND SETTERS
+ void setWidth(int n) {
+ _r.width = n;
+ }
+
+
+
+ void setHeight(int n) {
+ _r.height = n;
+ }
+
+ void setX(int n) {
+ _r.x = n;
+ }
+
+ void setY(int n) {
+ _r.y = n;
+ }
+}
+
View
423 processing/StyleBlasterGrabber/applet/OpticalFlow.pde
@@ -0,0 +1,423 @@
+/* OpenProcessing Tweak of *@*http://www.openprocessing.org/sketch/10435*@* */
+//Made into a class by Jack Kalish www.jackkalish.com
+/* !do not delete the line above, required for linking your tweak if you re-upload */
+// Optical Flow 2010/05/28
+// Hidetoshi Shimodaira shimo@is.titech.ac.jp 2010 GPL
+import processing.video.*;
+
+
+class OpticalFlow {
+
+ ///////////////////////////////////////////////
+ // parameters for desktop pc (high performance)
+
+ int gs=20; // grid step (pixels)
+ float predsec=1.0; // prediction time (sec): larger for longer vector
+
+ ///////////////////////////////////////////////
+ // use video
+ PImage video;
+
+ PFont font;
+ color[] vline;
+ MovieMaker movie;
+
+ // capture parameters
+ int fps=30;
+
+
+ int wscreen, hscreen, as, gw, gh, gs2;
+ float df, xFlowSum;
+
+ // regression vectors
+ float[] fx, fy, ft;
+ int fm=3*9; // length of the vectors
+
+ // regularization term for regression
+ float fc=pow(10, 8); // larger values for noisy video
+
+ // smoothing parameters
+ float wflow=0.1; // smaller value for longer smoothing
+
+ // switch
+ boolean flagseg=false; // segmentation of moving objects?
+ boolean flagball=false; // playing ball game?
+ boolean flagmirror=false; // mirroring image?
+ boolean flagflow=false; // draw opticalflow vectors?
+ boolean flagsound=true; // sound effect?
+ boolean flagimage=true; // show video image ?
+ boolean flagmovie=false; // saving movie?
+
+ // internally used variables
+ float ar, ag, ab; // used as return value of pixave
+ float[] dtr, dtg, dtb; // differentiation by t (red,gree,blue)
+ float[] dxr, dxg, dxb; // differentiation by x (red,gree,blue)
+ float[] dyr, dyg, dyb; // differentiation by y (red,gree,blue)
+ float[] par, pag, pab; // averaged grid values (red,gree,blue)
+ float[] flowx, flowy; // computed optical flow
+ float[] sflowx, sflowy; // slowly changing version of the flow
+ int clockNow, clockPrev, clockDiff; // for timing check
+
+ float ballpx, ballpy, ballvx, ballvy, ballgy, ballsz, ballsz2, ballfv, ballhv, ballvmax;
+
+ OpticalFlow(Capture v) {
+ wscreen=width;
+ hscreen=height;
+
+ // grid parameters
+ as=gs*2; // window size for averaging (-as,...,+as)
+ gw=wscreen/gs;
+ gh=hscreen/gs;
+ gs2=gs/2;
+ df=predsec*fps;
+
+ // playing ball parameters
+ ballpx=wscreen*0.5; // position x
+ ballpy=hscreen*0.5; // position y
+ ballvx=0.0; // velocity x
+ ballvy=0.0; // velocity y
+ ballgy=0.05; // gravitation
+ ballsz=30.0; // size
+ ballsz2=ballsz/2;
+ ballfv=0.8; // rebound factor
+ ballhv=50.0; // hit factor
+ ballvmax=10.0; // max velocity (pixel/frame)
+
+ // screen and video
+ video = v;
+ // font
+ font=createFont("Verdana", 10);
+ textFont(font);
+ // draw
+ ellipseMode(CENTER);
+
+ // arrays
+ par = new float[gw*gh];
+ pag = new float[gw*gh];
+ pab = new float[gw*gh];
+ dtr = new float[gw*gh];
+ dtg = new float[gw*gh];
+ dtb = new float[gw*gh];
+ dxr = new float[gw*gh];
+ dxg = new float[gw*gh];
+ dxb = new float[gw*gh];
+ dyr = new float[gw*gh];
+ dyg = new float[gw*gh];
+ dyb = new float[gw*gh];
+ flowx = new float[gw*gh];
+ flowy = new float[gw*gh];
+ sflowx = new float[gw*gh];
+ sflowy = new float[gw*gh];
+ fx = new float[fm];
+ fy = new float[fm];
+ ft = new float[fm];
+ vline = new color[wscreen];
+ }
+
+
+ // calculate average pixel value (r,g,b) for rectangle region
+ void pixave(int x1, int y1, int x2, int y2) {
+ float sumr, sumg, sumb;
+ color pix;
+ int r, g, b;
+ int n;
+
+ if (x1<0) x1=0;
+ if (x2>=wscreen) x2=wscreen-1;
+ if (y1<0) y1=0;
+ if (y2>=hscreen) y2=hscreen-1;
+
+ sumr=sumg=sumb=0.0;
+ for (int y=y1; y<=y2; y++) {
+ for (int i=wscreen*y+x1; i<=wscreen*y+x2; i++) {
+ pix=video.pixels[i];
+ b=pix & 0xFF; // blue
+ pix = pix >> 8;
+ g=pix & 0xFF; // green
+ pix = pix >> 8;
+ r=pix & 0xFF; // red
+ // averaging the values
+ sumr += r;
+ sumg += g;
+ sumb += b;
+ }
+ }
+ n = (x2-x1+1)*(y2-y1+1); // number of pixels
+ // the results are stored in static variables
+ ar = sumr/n;
+ ag=sumg/n;
+ ab=sumb/n;
+ }
+
+ // extract values from 9 neighbour grids
+ void getnext9(float x[], float y[], int i, int j) {
+ y[j+0] = x[i+0];
+ y[j+1] = x[i-1];
+ y[j+2] = x[i+1];
+ y[j+3] = x[i-gw];
+ y[j+4] = x[i+gw];
+ y[j+5] = x[i-gw-1];
+ y[j+6] = x[i-gw+1];
+ y[j+7] = x[i+gw-1];
+ y[j+8] = x[i+gw+1];
+ }
+
+ // solve optical flow by least squares (regression analysis)
+ void solveflow(int ig) {
+ float xx, xy, yy, xt, yt;
+ float a, u, v, w;
+
+ // prepare covariances
+ xx=xy=yy=xt=yt=0.0;
+ for (int i=0;i<fm;i++) {
+ xx += fx[i]*fx[i];
+ xy += fx[i]*fy[i];
+ yy += fy[i]*fy[i];
+ xt += fx[i]*ft[i];
+ yt += fy[i]*ft[i];
+ }
+
+ // least squares computation
+ a = xx*yy - xy*xy + fc; // fc is for stable computation
+ u = yy*xt - xy*yt; // x direction
+ v = xx*yt - xy*xt; // y direction
+
+ // write back
+ flowx[ig] = -2*gs*u/a; // optical flow x (pixel per frame)
+ flowy[ig] = -2*gs*v/a; // optical flow y (pixel per frame)
+ }
+
+ void updateImage(PImage i) {
+ video = i;
+ }
+
+ void draw() {
+ rectMode(CENTER);
+
+ // clock in msec
+ clockNow = millis();
+ clockDiff = clockNow - clockPrev;
+ clockPrev = clockNow;
+
+ // mirror
+ if (flagmirror) {
+ for (int y=0;y<hscreen;y++) {
+ int ig=y*wscreen;
+ for (int x=0; x<wscreen; x++)
+ vline[x] = video.pixels[ig+x];
+ for (int x=0; x<wscreen; x++)
+ video.pixels[ig+x]=vline[wscreen-1-x];
+ }
+ }
+
+ // 1st sweep : differentiation by time
+ for (int ix=0;ix<gw;ix++) {
+ int x0=ix*gs+gs2;
+ for (int iy=0;iy<gh;iy++) {
+ int y0=iy*gs+gs2;
+ int ig=iy*gw+ix;
+ // compute average pixel at (x0,y0)
+ pixave(x0-as, y0-as, x0+as, y0+as);
+ // compute time difference
+ dtr[ig] = ar-par[ig]; // red
+ dtg[ig] = ag-pag[ig]; // green
+ dtb[ig] = ab-pab[ig]; // blue
+ // save the pixel
+ par[ig]=ar;
+ pag[ig]=ag;
+ pab[ig]=ab;
+ }
+ }
+
+ // 2nd sweep : differentiations by x and y
+ for (int ix=1;ix<gw-1;ix++) {
+ for (int iy=1;iy<gh-1;iy++) {
+ int ig=iy*gw+ix;
+ // compute x difference
+ dxr[ig] = par[ig+1]-par[ig-1]; // red
+ dxg[ig] = pag[ig+1]-pag[ig-1]; // green
+ dxb[ig] = pab[ig+1]-pab[ig-1]; // blue
+ // compute y difference
+ dyr[ig] = par[ig+gw]-par[ig-gw]; // red
+ dyg[ig] = pag[ig+gw]-pag[ig-gw]; // green
+ dyb[ig] = pab[ig+gw]-pab[ig-gw]; // blue
+ }
+ }
+
+ // 3rd sweep : solving optical flow
+ xFlowSum = 0;
+
+ for (int ix=1;ix<gw-1;ix++) {
+ int x0=ix*gs+gs2;
+ for (int iy=1;iy<gh-1;iy++) {
+ int y0=iy*gs+gs2;
+ int ig=iy*gw+ix;
+
+ // prepare vectors fx, fy, ft
+ getnext9(dxr, fx, ig, 0); // dx red
+ getnext9(dxg, fx, ig, 9); // dx green
+ getnext9(dxb, fx, ig, 18);// dx blue
+ getnext9(dyr, fy, ig, 0); // dy red
+ getnext9(dyg, fy, ig, 9); // dy green
+ getnext9(dyb, fy, ig, 18);// dy blue
+ getnext9(dtr, ft, ig, 0); // dt red
+ getnext9(dtg, ft, ig, 9); // dt green
+ getnext9(dtb, ft, ig, 18);// dt blue
+
+ // solve for (flowx, flowy) such that
+ // fx flowx + fy flowy + ft = 0
+ solveflow(ig);
+
+ // smoothing
+ sflowx[ig]+=(flowx[ig]-sflowx[ig])*wflow;
+ sflowy[ig]+=(flowy[ig]-sflowy[ig])*wflow;
+
+ xFlowSum += sflowx[ig];
+ }
+ }
+
+ // 4th sweep : draw the flow
+ if (flagseg) {
+ noStroke();
+ fill(0);
+ for (int ix=0;ix<gw;ix++) {
+ int x0=ix*gs+gs2;
+ for (int iy=0;iy<gh;iy++) {
+ int y0=iy*gs+gs2;
+ int ig=iy*gw+ix;
+
+ float u=df*sflowx[ig];
+ float v=df*sflowy[ig];
+
+
+
+ float a=sqrt(u*u+v*v);
+ if (a<2.0) rect(x0, y0, gs, gs);
+ }
+ }
+ }
+
+
+ // int flowSum = gw * gh;
+
+
+ // 5th sweep : draw the flow
+ if (flagflow) {
+ for (int ix=0;ix<gw;ix++) {
+ int x0=ix*gs+gs2;
+ for (int iy=0;iy<gh;iy++) {
+ int y0=iy*gs+gs2;
+ int ig=iy*gw+ix;
+
+ float u=df*sflowx[ig];
+ float v=df*sflowy[ig];
+
+ // xFlowSum += u;
+ // yFlow += v;
+
+ // draw the line segments for optical flow
+ float a=sqrt(u*u+v*v);
+ if (a>=2.0) { // draw only if the length >=2.0
+ float r=0.5*(1.0+u/(a+0.1));
+ float g=0.5*(1.0+v/(a+0.1));
+ float b=0.5*(2.0-(r+g));
+ stroke(255*r, 255*g, 255*b);
+ line(x0, y0, x0+u, y0+v);
+ }
+ }
+ }
+ }
+
+ ///////////////////////////////////////////////////////
+ // ball movement : not essential for optical flow
+ /* if (flagball) {
+ // updatating position and velocity
+ ballpx += ballvx;
+ ballpy += ballvy;
+ ballvy += ballgy;
+
+ // reflecton
+ if (ballpx<ballsz2) {
+ ballpx=ballsz2;
+ ballvx=-ballvx*ballfv;
+ }
+ else if (ballpx>wscreen-ballsz2) {
+ ballpx=wscreen-ballsz2;
+ ballvx=-ballvx*ballfv;
+ }
+ if (ballpy<ballsz2) {
+ ballpy=ballsz2;
+ ballvy=-ballvy*ballfv;
+ }
+ else if (ballpy>hscreen-ballsz2) {
+ ballpy=hscreen-ballsz2;
+ ballvy=-ballvy*ballfv;
+ }
+
+ // draw the ball
+ fill(50, 200, 200);
+ stroke(0, 100, 100);
+ ellipse(ballpx, ballpy, ballsz, ballsz);
+
+ // find the grid
+ int ix= round((ballpx-gs2)/gs);
+ int iy= round((ballpy-gs2)/gs);
+ if (ix<1) ix=1;
+ else if (ix>gw-2) ix=gw-2;
+ if (iy<1) iy=1;
+ else if (iy>gh-2) iy=gh-2;
+ int ig=iy*gw+ix;
+
+ // hit the ball by your movement
+ float u=sflowx[ig];
+ float v=sflowy[ig];
+ float a=sqrt(u*u+v*v);
+ u=u/a;
+ v=v/a;
+ if (a>=2.0) a=2.0;
+ if (a>=0.3) {
+ ballvx += ballhv*a*u;
+ ballvy += ballhv*a*v;
+ float b=sqrt(ballvx*ballvx+ballvy*ballvy);
+ if (b>ballvmax) {
+ ballvx = ballvmax*ballvx/b;
+ ballvy = ballvmax*ballvy/b;
+ }
+ }
+
+ }*/
+
+ ///////////////////////////////////////////////////
+ // recording movie
+ if (flagmovie) movie.addFrame();
+
+ // print information (not shown in the movie)
+ fill(255, 0, 0);
+ // if (flagmovie) text("rec", 40, 10);
+ }
+
+ /* void keyPressed() {
+
+ if (key==' ') { // kick the ball
+ ballvy = -3.0;
+ }
+ else if (key=='b') { // show the ball on/off
+ flagball=!flagball;
+ if (flagball) { // put the ball at the center
+ ballpx=wscreen*0.5;
+ ballpy=hscreen*0.5;
+ ballvx=ballvy=0.0;
+ }
+ }
+ }*/
+
+ //GETTER AND SETTERS
+ float getXFlow(){
+ float xsum = 0;
+ for(int i=0; i<sflowx.length; i++){
+ xsum += sflowx[i];
+ }
+ xsum /= sflowx.length;
+ return xsum;
+ }
+}
View
BIN  processing/StyleBlasterGrabber/applet/StyleBlasterGrabber.jar
Binary file not shown
View
847 processing/StyleBlasterGrabber/applet/StyleBlasterGrabber.java
@@ -0,0 +1,847 @@
+import processing.core.*;
+import processing.xml.*;
+
+import processing.opengl.*;
+import processing.video.*;
+import org.seltar.Bytes2Web.*;
+import java.awt.Rectangle;
+import gifAnimation.*;
+import java.awt.Rectangle;
+import processing.video.*;
+import processing.video.*;
+
+import java.applet.*;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.event.MouseEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.FocusEvent;
+import java.awt.Image;
+import java.io.*;
+import java.net.*;
+import java.text.*;
+import java.util.*;
+import java.util.zip.*;
+import java.util.regex.*;
+
+public class StyleBlasterGrabber extends PApplet {
+
+
+
+
+
+
+
+OpticalFlow of;
+Capture cam;
+Capture sensor;
+Timer cameraTimer, sensorTimer;
+int numPixels;
+boolean blast; //turns photo-taking on or off
+boolean ignoreSensor = true;
+boolean debug = false;
+boolean uploading = false;
+boolean checkRight = false;
+boolean grab = false;
+boolean disable = false;
+boolean recordGif = false;
+boolean doGifs = false;
+ImageToWeb img;
+byte[] imgBytes;
+PImage grabImage;
+GifMaker gifExport;
+
+MotionSensor leftSensor;
+
+//SETUP VARS
+String version = "1.5";
+int startHour = 7; //am
+int endHour = 16; //3:59pm
+int endMinute = 25;
+int sensorBuffer = -220;
+int sensorBufferY = 50;
+String uploadURL = "http://styleblaster.herokuapp.com/upload";
+int camWidth;
+int camHeight = 720;
+int sensorThreshold = 13;
+int flowThreshold = -220;
+float sensorRes = 1;
+
+public void setup() {
+ int camWidth = 1280;//(16*camHeight)/9; //get correct aspect ratio for width
+ //camHeight = 2;
+ int sketchHeight = 1000;
+ int sketchWidth = 666;
+ float m = .7f;
+
+ size(round(sketchWidth*m), round(sketchHeight*m));
+ // size(1280, 720);
+
+ String[] devices = Capture.list();
+ // uncomment the line below to print a list of devices ready for img capture
+ println(devices);
+ fill(255, 50, 50);
+ noFill();
+ String[] cameras = Capture.list();
+ if (version == "2.0") {
+ cam = new Capture(this, 1280, 960, "Logitech Camera");
+ }
+ else {
+ // cam = new Capture(this, 2592,1944);
+ //Logitech 910c
+ //cam = new Capture(this, 1280, 960);
+ //Microsoft Studio
+ cam = new Capture(this, 1920, 1080);
+ // cam = new Capture(this, 1280, 720);
+ }
+
+ if (version == "2.0") {
+ // cam.start();
+ }
+ //set global framerate
+ int f = 25;
+ frameRate(f);
+ cam.frameRate(f);
+ cameraTimer = new Timer(1000);
+
+ sensorTimer = new Timer(1000);
+
+ //initialize the hit areas
+ leftSensor = new MotionSensor();
+
+ of = new OpticalFlow(cam);
+
+
+}
+
+public void draw() {
+ background(0);
+ blast = false;
+ if (hour()>=startHour) {
+ if (hour()<endHour) {
+ if (cam.available()) {
+ if (disable == false) {
+ blast = true;
+ }
+ }
+ }
+ }
+
+ if (mousePressed) {
+ rectMode(CORNER);
+
+ leftSensor._bDiff = 0;
+ ignoreSensor = true;
+ int sensorWidth = round((mouseX - leftSensor._r.x));
+ int sensorHeight = mouseY - leftSensor._r.y;
+ leftSensor._r.width = sensorWidth;
+ leftSensor._r.height = sensorHeight;
+
+ leftSensor.update();
+
+ blast = false;
+ }
+
+ if (! uploading) {
+ cam.read();
+ grabImage = cam.get(cam.width/2-width/2, cam.height/2-height/2, width, height);
+ image(grabImage, 0, 0);
+
+ of.updateImage(grabImage);
+ of.draw();
+
+ if (ignoreSensor) {
+ ignoreSensor = false;
+ }
+ else {
+ if (grab) {
+ println("!!!HIT!!! @ : ");
+ fill(255, 0, 0);
+ onHit();
+ }
+ else {
+ noFill();
+ }
+ }
+ }
+
+ stroke(255, 100, 100);
+ //***DRAW DEBUG SHIT TO SCREEN***
+ if (debug) {
+ rectMode(CORNER);
+ noFill();
+ //date
+ text(getTimestamp(), 5, 15);
+
+ leftSensor.draw();
+
+ fill(255);
+ text("threshold: "+sensorThreshold, 5, height-5);
+ text("xFlowSum: "+of.xFlowSum, width - 150, height - 5); // time (msec) for this frame
+ }
+
+ if (blast) {
+
+ //BLAST OFF!
+ boolean hit = false;
+ grab = false;
+ //update the reference image on the sensors
+ leftSensor._image = grabImage;
+ if (doGifs){
+ if (of.xFlowSum < flowThreshold) {
+ if (!recordGif) {
+ gifExport = new GifMaker(this, getTimestamp()+".gif");
+ gifExport.setRepeat(0); // make it an "endless" animation
+ }
+ //start recording gif
+ gifExport.setDelay(40);
+ gifExport.addFrame();
+ recordGif = true;
+ }
+ else if (recordGif) {
+ //stop recording gif
+ gifExport.finish();
+ recordGif = false;
+ // gifExport = new GifMaker(this, "export.gif");
+ }}
+
+ hit = leftSensor.checkHitArea();
+ if (hit) {
+ leftSensor.reset();
+
+ if (of.xFlowSum < flowThreshold) {
+ grab = true;
+ }
+ }
+ }
+}
+
+public void mousePressed() {
+ leftSensor._r.x = mouseX;
+ leftSensor._r.y = mouseY;
+ ignoreSensor = true;
+}
+
+public void onHit() {
+ //IS THE CAMERA TIMER NEEDED HERE?
+ if (cameraTimer.isFinished()) {
+ takePicture();
+ cameraTimer.start();
+ }
+}
+
+public String getTimestamp() {
+ String filename = "";
+ filename += String.valueOf(year());
+ filename += "-";
+ filename += String.valueOf(month());
+ filename += "-";
+ filename += String.valueOf(day());
+ filename += "-";
+ filename += String.valueOf(hour());
+ filename += "-";
+ filename += String.valueOf(minute());
+ filename += "-";
+ filename += String.valueOf(second());
+ return filename;
+}
+
+public void takePicture() {
+
+ /* PGraphics pg = createGraphics(grabImage.width, grabImage.height, P2D); // I create a PGraphics from it
+ pg.loadPixels();
+ grabImage.loadPixels();
+ for (int i = 0; i < grabImage.pixels.length; i++)
+ {
+ pg.pixels = grabImage.pixels;
+ }*/
+
+ // "this" references the processing PApplet itself and is mandatory here
+ img = new ImageToWeb(this);
+ img.setType(ImageToWeb.PNG);
+
+ // load the raw bytes from the thing
+ imgBytes = img.getBytes();
+
+ // upload the picture
+ uploadPicture();
+}
+
+public void uploadPicture() {
+ // img.post(String project, String url, String filename, boolean popup, byte[] bytes)
+ img.post("test", uploadURL, getTimestamp() + ".png", false, imgBytes);
+ cameraTimer.start();
+}
+
+public void keyPressed() {
+ if (key == ' ') {
+ debug = !debug;
+ }
+ else if (key == 'c') {
+ //open camera settings
+ cam.settings();
+ ignoreSensor = true;
+ }
+ else if (key == '.') {
+ //increase the threshold
+ sensorThreshold += 1;
+ leftSensor._thresh = sensorThreshold;
+ }
+ else if (key == ',') {
+ //increase the threshold
+ sensorThreshold -= 1;
+
+ leftSensor._thresh = sensorThreshold;
+ }
+ else if (key=='w') of.flagseg=!of.flagseg; // segmentation on/off
+ else if (key=='s') of.flagsound=!of.flagsound; // sound on/off
+ else if (key=='m') of.flagmirror=!of.flagmirror; // mirror on/off
+ else if (key=='f') of.flagflow=!of.flagflow; // show opticalflow on/off
+ else if (key=='d') disable=!disable; // disable/enable
+}
+
+
+
+
+
+class MotionSensor {
+ Rectangle _r = new Rectangle(0, 0, 0, 0);
+ int _thresh = 13;
+ float _sensorRes = 1;
+ float _lastTestAreaBrightness, _bDiff;
+ int _numPixels;
+ PImage _image;
+ // Capture _cam;
+
+ MotionSensor() {
+
+ }
+
+ public boolean checkHitArea() {
+ // _cam = cam;
+ float testAreaBrightness = getTestAreaBrightness();
+ //find teh absolute diff of the current brightness and the last brightness
+ //println("testAreaBrightness: "+testAreaBrightness);
+ // println("_lastTestAreaBrightness: "+_lastTestAreaBrightness);
+ _bDiff = abs(testAreaBrightness - _lastTestAreaBrightness);
+
+ _lastTestAreaBrightness = testAreaBrightness;
+
+ if (_bDiff > _thresh) {
+ return true;
+ }
+ return false;
+ }
+
+ //returns the average brightness of the test area defined by the test area rectangle
+ public float getTestAreaBrightness() {
+ _image.loadPixels();
+ float testAreaBrightness = 0;
+
+ // For each pixel in the test area
+ for (int x = _r.x; x < _r.x+_r.width; x+=_sensorRes) {
+ for (int y = _r.y; y < _r.y+_r.height; y+=_sensorRes) {
+ // println("_cam.get(x, y): "+ _cam.get(x, y));
+ testAreaBrightness += brightness(_image.get(x, y));
+ // println("brightness(_cam.get(x, y): "+ brightness(_cam.get(x, y)));
+ }
+ }
+
+ testAreaBrightness /= _numPixels;
+ testAreaBrightness *= _sensorRes;
+
+ return testAreaBrightness;
+ }
+
+ public void draw() {
+ // println("MotionSensor.draw");
+ rect(_r.x, _r.y, _r.width, _r.height);
+ text(_bDiff, _r.x, _r.y - 5);
+ }
+
+ public void update() {
+ _numPixels = _r.width*_r.height;
+ }
+
+ public void reset(){
+ float testAreaBrightness = getTestAreaBrightness();
+ _bDiff = abs(testAreaBrightness - _lastTestAreaBrightness);
+ _lastTestAreaBrightness = testAreaBrightness;
+ }
+
+ //GETTERS AND SETTERS
+ public void setWidth(int n) {
+ _r.width = n;
+ }
+
+
+
+ public void setHeight(int n) {
+ _r.height = n;
+ }
+
+ public void setX(int n) {
+ _r.x = n;
+ }
+
+ public void setY(int n) {
+ _r.y = n;
+ }
+}
+
+/* OpenProcessing Tweak of *@*http://www.openprocessing.org/sketch/10435*@* */
+//Made into a class by Jack Kalish www.jackkalish.com
+/* !do not delete the line above, required for linking your tweak if you re-upload */
+// Optical Flow 2010/05/28
+// Hidetoshi Shimodaira shimo@is.titech.ac.jp 2010 GPL
+
+
+
+class OpticalFlow {
+
+ ///////////////////////////////////////////////
+ // parameters for desktop pc (high performance)
+
+ int gs=20; // grid step (pixels)
+ float predsec=1.0f; // prediction time (sec): larger for longer vector
+
+ ///////////////////////////////////////////////
+ // use video
+ PImage video;
+
+ PFont font;
+ int[] vline;
+ MovieMaker movie;
+
+ // capture parameters
+ int fps=30;
+
+
+ int wscreen, hscreen, as, gw, gh, gs2;
+ float df, xFlowSum;
+
+ // regression vectors
+ float[] fx, fy, ft;
+ int fm=3*9; // length of the vectors
+
+ // regularization term for regression
+ float fc=pow(10, 8); // larger values for noisy video
+
+ // smoothing parameters
+ float wflow=0.1f; // smaller value for longer smoothing
+
+ // switch
+ boolean flagseg=false; // segmentation of moving objects?
+ boolean flagball=false; // playing ball game?
+ boolean flagmirror=false; // mirroring image?
+ boolean flagflow=false; // draw opticalflow vectors?
+ boolean flagsound=true; // sound effect?
+ boolean flagimage=true; // show video image ?
+ boolean flagmovie=false; // saving movie?
+
+ // internally used variables
+ float ar, ag, ab; // used as return value of pixave
+ float[] dtr, dtg, dtb; // differentiation by t (red,gree,blue)
+ float[] dxr, dxg, dxb; // differentiation by x (red,gree,blue)
+ float[] dyr, dyg, dyb; // differentiation by y (red,gree,blue)
+ float[] par, pag, pab; // averaged grid values (red,gree,blue)
+ float[] flowx, flowy; // computed optical flow
+ float[] sflowx, sflowy; // slowly changing version of the flow
+ int clockNow, clockPrev, clockDiff; // for timing check
+
+ float ballpx, ballpy, ballvx, ballvy, ballgy, ballsz, ballsz2, ballfv, ballhv, ballvmax;
+
+ OpticalFlow(Capture v) {
+ wscreen=width;
+ hscreen=height;
+
+ // grid parameters
+ as=gs*2; // window size for averaging (-as,...,+as)
+ gw=wscreen/gs;
+ gh=hscreen/gs;
+ gs2=gs/2;
+ df=predsec*fps;
+
+ // playing ball parameters
+ ballpx=wscreen*0.5f; // position x
+ ballpy=hscreen*0.5f; // position y
+ ballvx=0.0f; // velocity x
+ ballvy=0.0f; // velocity y
+ ballgy=0.05f; // gravitation
+ ballsz=30.0f; // size
+ ballsz2=ballsz/2;
+ ballfv=0.8f; // rebound factor
+ ballhv=50.0f; // hit factor
+ ballvmax=10.0f; // max velocity (pixel/frame)
+
+ // screen and video
+ video = v;
+ // font
+ font=createFont("Verdana", 10);
+ textFont(font);
+ // draw
+ ellipseMode(CENTER);
+
+ // arrays
+ par = new float[gw*gh];
+ pag = new float[gw*gh];
+ pab = new float[gw*gh];
+ dtr = new float[gw*gh];
+ dtg = new float[gw*gh];
+ dtb = new float[gw*gh];
+ dxr = new float[gw*gh];
+ dxg = new float[gw*gh];
+ dxb = new float[gw*gh];
+ dyr = new float[gw*gh];
+ dyg = new float[gw*gh];
+ dyb = new float[gw*gh];
+ flowx = new float[gw*gh];
+ flowy = new float[gw*gh];
+ sflowx = new float[gw*gh];
+ sflowy = new float[gw*gh];
+ fx = new float[fm];
+ fy = new float[fm];
+ ft = new float[fm];
+ vline = new int[wscreen];
+ }
+
+
+ // calculate average pixel value (r,g,b) for rectangle region
+ public void pixave(int x1, int y1, int x2, int y2) {
+ float sumr, sumg, sumb;
+ int pix;
+ int r, g, b;
+ int n;
+
+ if (x1<0) x1=0;
+ if (x2>=wscreen) x2=wscreen-1;
+ if (y1<0) y1=0;
+ if (y2>=hscreen) y2=hscreen-1;
+
+ sumr=sumg=sumb=0.0f;
+ for (int y=y1; y<=y2; y++) {
+ for (int i=wscreen*y+x1; i<=wscreen*y+x2; i++) {
+ pix=video.pixels[i];
+ b=pix & 0xFF; // blue
+ pix = pix >> 8;
+ g=pix & 0xFF; // green
+ pix = pix >> 8;
+ r=pix & 0xFF; // red
+ // averaging the values
+ sumr += r;
+ sumg += g;
+ sumb += b;
+ }
+ }
+ n = (x2-x1+1)*(y2-y1+1); // number of pixels
+ // the results are stored in static variables
+ ar = sumr/n;
+ ag=sumg/n;
+ ab=sumb/n;
+ }
+
+ // extract values from 9 neighbour grids
+ public void getnext9(float x[], float y[], int i, int j) {
+ y[j+0] = x[i+0];
+ y[j+1] = x[i-1];
+ y[j+2] = x[i+1];
+ y[j+3] = x[i-gw];
+ y[j+4] = x[i+gw];
+ y[j+5] = x[i-gw-1];
+ y[j+6] = x[i-gw+1];
+ y[j+7] = x[i+gw-1];
+ y[j+8] = x[i+gw+1];
+ }
+
+ // solve optical flow by least squares (regression analysis)
+ public void solveflow(int ig) {
+ float xx, xy, yy, xt, yt;
+ float a, u, v, w;
+
+ // prepare covariances
+ xx=xy=yy=xt=yt=0.0f;
+ for (int i=0;i<fm;i++) {
+ xx += fx[i]*fx[i];
+ xy += fx[i]*fy[i];
+ yy += fy[i]*fy[i];
+ xt += fx[i]*ft[i];
+ yt += fy[i]*ft[i];
+ }
+
+ // least squares computation
+ a = xx*yy - xy*xy + fc; // fc is for stable computation
+ u = yy*xt - xy*yt; // x direction
+ v = xx*yt - xy*xt; // y direction
+
+ // write back
+ flowx[ig] = -2*gs*u/a; // optical flow x (pixel per frame)
+ flowy[ig] = -2*gs*v/a; // optical flow y (pixel per frame)
+ }
+
+ public void updateImage(PImage i) {
+ video = i;
+ }
+
+ public void draw() {
+ rectMode(CENTER);
+
+ // clock in msec
+ clockNow = millis();
+ clockDiff = clockNow - clockPrev;
+ clockPrev = clockNow;
+
+ // mirror
+ if (flagmirror) {
+ for (int y=0;y<hscreen;y++) {
+ int ig=y*wscreen;
+ for (int x=0; x<wscreen; x++)
+ vline[x] = video.pixels[ig+x];
+ for (int x=0; x<wscreen; x++)
+ video.pixels[ig+x]=vline[wscreen-1-x];
+ }
+ }
+
+ // 1st sweep : differentiation by time
+ for (int ix=0;ix<gw;ix++) {
+ int x0=ix*gs+gs2;
+ for (int iy=0;iy<gh;iy++) {
+ int y0=iy*gs+gs2;
+ int ig=iy*gw+ix;
+ // compute average pixel at (x0,y0)
+ pixave(x0-as, y0-as, x0+as, y0+as);
+ // compute time difference
+ dtr[ig] = ar-par[ig]; // red
+ dtg[ig] = ag-pag[ig]; // green
+ dtb[ig] = ab-pab[ig]; // blue
+ // save the pixel
+ par[ig]=ar;
+ pag[ig]=ag;
+ pab[ig]=ab;
+ }
+ }
+
+ // 2nd sweep : differentiations by x and y
+ for (int ix=1;ix<gw-1;ix++) {
+ for (int iy=1;iy<gh-1;iy++) {
+ int ig=iy*gw+ix;
+ // compute x difference
+ dxr[ig] = par[ig+1]-par[ig-1]; // red
+ dxg[ig] = pag[ig+1]-pag[ig-1]; // green
+ dxb[ig] = pab[ig+1]-pab[ig-1]; // blue
+ // compute y difference
+ dyr[ig] = par[ig+gw]-par[ig-gw]; // red
+ dyg[ig] = pag[ig+gw]-pag[ig-gw]; // green
+ dyb[ig] = pab[ig+gw]-pab[ig-gw]; // blue
+ }
+ }
+
+ // 3rd sweep : solving optical flow
+ xFlowSum = 0;
+
+ for (int ix=1;ix<gw-1;ix++) {
+ int x0=ix*gs+gs2;
+ for (int iy=1;iy<gh-1;iy++) {
+ int y0=iy*gs+gs2;
+ int ig=iy*gw+ix;
+
+ // prepare vectors fx, fy, ft
+ getnext9(dxr, fx, ig, 0); // dx red
+ getnext9(dxg, fx, ig, 9); // dx green
+ getnext9(dxb, fx, ig, 18);// dx blue
+ getnext9(dyr, fy, ig, 0); // dy red
+ getnext9(dyg, fy, ig, 9); // dy green
+ getnext9(dyb, fy, ig, 18);// dy blue
+ getnext9(dtr, ft, ig, 0); // dt red
+ getnext9(dtg, ft, ig, 9); // dt green
+ getnext9(dtb, ft, ig, 18);// dt blue
+
+ // solve for (flowx, flowy) such that
+ // fx flowx + fy flowy + ft = 0
+ solveflow(ig);
+
+ // smoothing
+ sflowx[ig]+=(flowx[ig]-sflowx[ig])*wflow;
+ sflowy[ig]+=(flowy[ig]-sflowy[ig])*wflow;
+
+ xFlowSum += sflowx[ig];
+ }
+ }
+
+ // 4th sweep : draw the flow
+ if (flagseg) {
+ noStroke();
+ fill(0);
+ for (int ix=0;ix<gw;ix++) {
+ int x0=ix*gs+gs2;
+ for (int iy=0;iy<gh;iy++) {
+ int y0=iy*gs+gs2;
+ int ig=iy*gw+ix;
+
+ float u=df*sflowx[ig];
+ float v=df*sflowy[ig];
+
+
+
+ float a=sqrt(u*u+v*v);
+ if (a<2.0f) rect(x0, y0, gs, gs);
+ }
+ }
+ }
+
+
+ // int flowSum = gw * gh;
+
+
+ // 5th sweep : draw the flow
+ if (flagflow) {
+ for (int ix=0;ix<gw;ix++) {
+ int x0=ix*gs+gs2;
+ for (int iy=0;iy<gh;iy++) {
+ int y0=iy*gs+gs2;
+ int ig=iy*gw+ix;
+
+ float u=df*sflowx[ig];
+ float v=df*sflowy[ig];
+
+ // xFlowSum += u;
+ // yFlow += v;
+
+ // draw the line segments for optical flow
+ float a=sqrt(u*u+v*v);
+ if (a>=2.0f) { // draw only if the length >=2.0
+ float r=0.5f*(1.0f+u/(a+0.1f));
+ float g=0.5f*(1.0f+v/(a+0.1f));
+ float b=0.5f*(2.0f-(r+g));
+ stroke(255*r, 255*g, 255*b);
+ line(x0, y0, x0+u, y0+v);
+ }
+ }
+ }
+ }
+
+ ///////////////////////////////////////////////////////
+ // ball movement : not essential for optical flow
+ /* if (flagball) {
+ // updatating position and velocity
+ ballpx += ballvx;
+ ballpy += ballvy;
+ ballvy += ballgy;
+
+ // reflecton
+ if (ballpx<ballsz2) {
+ ballpx=ballsz2;
+ ballvx=-ballvx*ballfv;
+ }
+ else if (ballpx>wscreen-ballsz2) {
+ ballpx=wscreen-ballsz2;
+ ballvx=-ballvx*ballfv;
+ }
+ if (ballpy<ballsz2) {
+ ballpy=ballsz2;
+ ballvy=-ballvy*ballfv;
+ }
+ else if (ballpy>hscreen-ballsz2) {
+ ballpy=hscreen-ballsz2;
+ ballvy=-ballvy*ballfv;
+ }
+
+ // draw the ball
+ fill(50, 200, 200);
+ stroke(0, 100, 100);
+ ellipse(ballpx, ballpy, ballsz, ballsz);
+
+ // find the grid
+ int ix= round((ballpx-gs2)/gs);
+ int iy= round((ballpy-gs2)/gs);
+ if (ix<1) ix=1;
+ else if (ix>gw-2) ix=gw-2;
+ if (iy<1) iy=1;
+ else if (iy>gh-2) iy=gh-2;
+ int ig=iy*gw+ix;
+
+ // hit the ball by your movement
+ float u=sflowx[ig];
+ float v=sflowy[ig];
+ float a=sqrt(u*u+v*v);
+ u=u/a;
+ v=v/a;
+ if (a>=2.0) a=2.0;
+ if (a>=0.3) {
+ ballvx += ballhv*a*u;
+ ballvy += ballhv*a*v;
+ float b=sqrt(ballvx*ballvx+ballvy*ballvy);
+ if (b>ballvmax) {
+ ballvx = ballvmax*ballvx/b;
+ ballvy = ballvmax*ballvy/b;
+ }
+ }
+
+ }*/
+
+ ///////////////////////////////////////////////////
+ // recording movie
+ if (flagmovie) movie.addFrame();
+
+ // print information (not shown in the movie)
+ fill(255, 0, 0);
+ // if (flagmovie) text("rec", 40, 10);
+ }
+
+ /* void keyPressed() {
+
+ if (key==' ') { // kick the ball
+ ballvy = -3.0;
+ }
+ else if (key=='b') { // show the ball on/off
+ flagball=!flagball;
+ if (flagball) { // put the ball at the center
+ ballpx=wscreen*0.5;
+ ballpy=hscreen*0.5;
+ ballvx=ballvy=0.0;
+ }
+ }
+ }*/
+
+ //GETTER AND SETTERS
+ public float getXFlow(){
+ float xsum = 0;
+ for(int i=0; i<sflowx.length; i++){
+ xsum += sflowx[i];
+ }
+ xsum /= sflowx.length;
+ return xsum;
+ }
+}
+
+class Timer {
+
+ int savedTime; // When Timer started
+ int totalTime; // How long Timer should last
+
+ Timer(int tempTotalTime) {
+ totalTime = tempTotalTime;
+ }
+
+ // Starting the timer
+ public void start() {
+ // When the timer starts it stores the current time in milliseconds.
+ savedTime = millis();
+ }
+
+ // The function isFinished() returns true if 5,000 ms have passed.
+ // The work of the timer is farmed out to this method.
+ public boolean isFinished() {
+ // Check how much time has passed
+ int passedTime = millis()- savedTime;
+ if (passedTime > totalTime) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
+
+ static public void main(String args[]) {
+ PApplet.main(new String[] { "--bgcolor=#FFFFFF", "StyleBlasterGrabber" });
+ }
+}
View
274 processing/StyleBlasterGrabber/applet/StyleBlasterGrabber.pde
@@ -0,0 +1,274 @@
+import processing.opengl.*;
+import processing.video.*;
+import org.seltar.Bytes2Web.*;
+import java.awt.Rectangle;
+import gifAnimation.*;
+
+OpticalFlow of;
+Capture cam;
+Capture sensor;
+Timer cameraTimer, sensorTimer;
+int numPixels;
+boolean blast; //turns photo-taking on or off
+boolean ignoreSensor = true;
+boolean debug = false;
+boolean uploading = false;
+boolean checkRight = false;
+boolean grab = false;
+boolean disable = false;
+boolean recordGif = false;
+boolean doGifs = false;
+ImageToWeb img;
+byte[] imgBytes;
+PImage grabImage;
+GifMaker gifExport;
+
+MotionSensor leftSensor;
+
+//SETUP VARS
+String version = "1.5";
+int startHour = 7; //am
+int endHour = 16; //3:59pm
+int endMinute = 25;
+int sensorBuffer = -220;
+int sensorBufferY = 50;
+String uploadURL = "http://styleblaster.herokuapp.com/upload";
+int camWidth;
+int camHeight = 720;
+int sensorThreshold = 13;
+int flowThreshold = -220;
+float sensorRes = 1;
+
+public void setup() {
+ int camWidth = 1280;//(16*camHeight)/9; //get correct aspect ratio for width
+ //camHeight = 2;
+ int sketchHeight = 1000;
+ int sketchWidth = 666;
+ float m = .7;
+
+ size(round(sketchWidth*m), round(sketchHeight*m));
+ // size(1280, 720);
+
+ String[] devices = Capture.list();
+ // uncomment the line below to print a list of devices ready for img capture
+ println(devices);
+ fill(255, 50, 50);
+ noFill();
+ String[] cameras = Capture.list();
+ if (version == "2.0") {
+ cam = new Capture(this, 1280, 960, "Logitech Camera");
+ }
+ else {
+ // cam = new Capture(this, 2592,1944);
+ //Logitech 910c
+ //cam = new Capture(this, 1280, 960);
+ //Microsoft Studio
+ cam = new Capture(this, 1920, 1080);
+ // cam = new Capture(this, 1280, 720);
+ }
+
+ if (version == "2.0") {
+ // cam.start();
+ }
+ //set global framerate
+ int f = 25;
+ frameRate(f);
+ cam.frameRate(f);
+ cameraTimer = new Timer(1000);
+
+ sensorTimer = new Timer(1000);
+
+ //initialize the hit areas
+ leftSensor = new MotionSensor();
+
+ of = new OpticalFlow(cam);
+
+
+}
+
+void draw() {
+ background(0);
+ blast = false;
+ if (hour()>=startHour) {
+ if (hour()<endHour) {
+ if (cam.available()) {
+ if (disable == false) {
+ blast = true;
+ }
+ }
+ }
+ }
+
+ if (mousePressed) {
+ rectMode(CORNER);
+
+ leftSensor._bDiff = 0;
+ ignoreSensor = true;
+ int sensorWidth = round((mouseX - leftSensor._r.x));
+ int sensorHeight = mouseY - leftSensor._r.y;
+ leftSensor._r.width = sensorWidth;
+ leftSensor._r.height = sensorHeight;
+
+ leftSensor.update();
+
+ blast = false;
+ }
+
+ if (! uploading) {
+ cam.read();
+ grabImage = cam.get(cam.width/2-width/2, cam.height/2-height/2, width, height);
+ image(grabImage, 0, 0);
+
+ of.updateImage(grabImage);
+ of.draw();
+
+ if (ignoreSensor) {
+ ignoreSensor = false;
+ }
+ else {
+ if (grab) {
+ println("!!!HIT!!! @ : ");
+ fill(255, 0, 0);
+ onHit();
+ }
+ else {
+ noFill();
+ }
+ }
+ }
+
+ stroke(255, 100, 100);
+ //***DRAW DEBUG SHIT TO SCREEN***
+ if (debug) {
+ rectMode(CORNER);
+ noFill();
+ //date
+ text(getTimestamp(), 5, 15);
+
+ leftSensor.draw();
+
+ fill(255);
+ text("threshold: "+sensorThreshold, 5, height-5);
+ text("xFlowSum: "+of.xFlowSum, width - 150, height - 5); // time (msec) for this frame
+ }
+
+ if (blast) {
+
+ //BLAST OFF!
+ boolean hit = false;
+ grab = false;
+ //update the reference image on the sensors
+ leftSensor._image = grabImage;
+ if (doGifs){
+ if (of.xFlowSum < flowThreshold) {
+ if (!recordGif) {
+ gifExport = new GifMaker(this, getTimestamp()+".gif");
+ gifExport.setRepeat(0); // make it an "endless" animation
+ }
+ //start recording gif
+ gifExport.setDelay(40);
+ gifExport.addFrame();
+ recordGif = true;
+ }
+ else if (recordGif) {
+ //stop recording gif
+ gifExport.finish();
+ recordGif = false;
+ // gifExport = new GifMaker(this, "export.gif");
+ }}
+
+ hit = leftSensor.checkHitArea();
+ if (hit) {
+ leftSensor.reset();
+
+ if (of.xFlowSum < flowThreshold) {
+ grab = true;
+ }
+ }
+ }
+}
+
+void mousePressed() {
+ leftSensor._r.x = mouseX;
+ leftSensor._r.y = mouseY;
+ ignoreSensor = true;
+}
+
+void onHit() {
+ //IS THE CAMERA TIMER NEEDED HERE?
+ if (cameraTimer.isFinished()) {
+ takePicture();
+ cameraTimer.start();
+ }
+}
+
+String getTimestamp() {
+ String filename = "";
+ filename += String.valueOf(year());
+ filename += "-";
+ filename += String.valueOf(month());
+ filename += "-";
+ filename += String.valueOf(day());
+ filename += "-";
+ filename += String.valueOf(hour());
+ filename += "-";
+ filename += String.valueOf(minute());
+ filename += "-";
+ filename += String.valueOf(second());
+ return filename;
+}
+
+void takePicture() {
+
+ /* PGraphics pg = createGraphics(grabImage.width, grabImage.height, P2D); // I create a PGraphics from it
+ pg.loadPixels();
+ grabImage.loadPixels();
+ for (int i = 0; i < grabImage.pixels.length; i++)
+ {
+ pg.pixels = grabImage.pixels;
+ }*/
+
+ // "this" references the processing PApplet itself and is mandatory here
+ img = new ImageToWeb(this);
+ img.setType(ImageToWeb.PNG);
+
+ // load the raw bytes from the thing
+ imgBytes = img.getBytes();
+
+ // upload the picture
+ uploadPicture();
+}
+
+void uploadPicture() {
+ // img.post(String project, String url, String filename, boolean popup, byte[] bytes)
+ img.post("test", uploadURL, getTimestamp() + ".png", false, imgBytes);
+ cameraTimer.start();
+}
+
+void keyPressed() {
+ if (key == ' ') {
+ debug = !debug;
+ }
+ else if (key == 'c') {
+ //open camera settings
+ cam.settings();
+ ignoreSensor = true;
+ }
+ else if (key == '.') {
+ //increase the threshold
+ sensorThreshold += 1;
+ leftSensor._thresh = sensorThreshold;
+ }
+ else if (key == ',') {
+ //increase the threshold
+ sensorThreshold -= 1;
+
+ leftSensor._thresh = sensorThreshold;
+ }
+ else if (key=='w') of.flagseg=!of.flagseg; // segmentation on/off
+ else if (key=='s') of.flagsound=!of.flagsound; // sound on/off
+ else if (key=='m') of.flagmirror=!of.flagmirror; // mirror on/off
+ else if (key=='f') of.flagflow=!of.flagflow; // show opticalflow on/off
+ else if (key=='d') disable=!disable; // disable/enable
+}
+
View
BIN  processing/StyleBlasterGrabber/applet/core.jar
Binary file not shown
View
BIN  processing/StyleBlasterGrabber/applet/gifAnimation.jar
Binary file not shown
View
208 processing/StyleBlasterGrabber/applet/index.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <!-- charset must remain utf-8 to be handled properly by Processing -->
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+ <title>StyleBlasterGrabber : Built with Processing</title>
+
+ <style type="text/css">
+ /* <![CDATA[ */
+
+ body {
+ margin: 60px 0px 0px 55px;
+ font-family: verdana, geneva, arial, helvetica, sans-serif;
+ font-size: 11px;
+ background-color: #ddddcc;
+ text-decoration: none;
+ font-weight: normal;
+ line-height: normal;
+ }
+
+ a { color: #3399cc; }
+ a:link { color: #3399cc; text-decoration: underline; }
+ a:visited { color: #3399cc; text-decoration: underline; }
+ a:active { color: #3399cc; text-decoration: underline; }
+ a:hover { color: #3399cc; text-decoration: underline; }
+
+ /* ]]> */
+ </style>
+
+ </head>
+ <body>
+ <div id="content">
+
+ <div id="StyleBlasterGrabber_container">
+
+ <!--[if !IE]> -->
+ <object classid="java:org.jdesktop.applet.util.JNLPAppletLauncher"
+ type="application/x-java-applet"
+ archive="StyleBlasterGrabber.jar,opengl.jar,video.jar,postToWeb.jar,gifAnimation.jar,core.jar,http://download.java.net/media/applet-launcher/applet-launcher.jar,http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jar,http://download.java.net/media/gluegen/webstart/gluegen-rt.jar"
+ width="100" height="100"
+ standby="Loading Processing software..." >
+
+ <param name="archive" value="StyleBlasterGrabber.jar,opengl.jar,video.jar,postToWeb.jar,gifAnimation.jar,core.jar,http://download.java.net/media/applet-launcher/applet-launcher.jar,http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jar,http://download.java.net/media/gluegen/webstart/gluegen-rt.jar" />
+ <param name="jnlpNumExtensions" value="1">
+ <param name="jnlpExtension1" value="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp">
+
+ <param name="mayscript" value="true" />
+ <param name="scriptable" value="true" />
+
+ <param name="image" value="loading.gif" />
+ <param name="boxmessage" value="Loading Processing software..." />
+ <param name="boxbgcolor" value="#FFFFFF" />
+ <param name="progressbar" value="true" />
+ <!--<param name="noddraw.check" value="true">-->
+
+ <param name="subapplet.classname" value="StyleBlasterGrabber" />
+ <param name="subapplet.displayname" value="StyleBlasterGrabber" />
+
+ <param name="test_string" value="outer" />
+ <!--<![endif]-->
+
+ <object classid="clsid:CAFEEFAC-0016-0000-FFFF-ABCDEFFEDCBA"
+ width="100" height="100"
+ standby="Loading Processing software..." >
+
+ <param name="code"
+ value="org.jdesktop.applet.util.JNLPAppletLauncher" />
+ <param name="archive" value="StyleBlasterGrabber.jar,opengl.jar,video.jar,postToWeb.jar,gifAnimation.jar,core.jar,http://download.java.net/media/applet-launcher/applet-launcher.jar,http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jar,http://download.java.net/media/gluegen/webstart/gluegen-rt.jar" />
+ <param name="jnlpNumExtensions" value="1">
+ <param name="jnlpExtension1" value="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp">
+
+ <param name="mayscript" value="true" />
+ <param name="scriptable" value="true" />
+
+ <param name="image" value="loading.gif" />
+ <param name="boxmessage" value="Loading Processing software..." />
+ <param name="boxbgcolor" value="#FFFFFF" />
+ <param name="progressbar" value="true" />
+ <!--<param name="noddraw.check" value="true">-->
+
+ <param name="subapplet.classname" value="StyleBlasterGrabber" />
+ <param name="subapplet.displayname" value="StyleBlasterGrabber" />
+
+ <param name="test_string" value="inner" />
+
+ <p>
+ <strong>
+ This browser does not have a Java Plug-in.
+ <br />
+ <a href="http://www.java.com/getjava" title="Download Java Plug-in">
+ Get the latest Java Plug-in here.
+ </a>
+ </strong>
+ </p>
+
+ </object>
+
+ <!--[if !IE]> -->
+ </object>
+ <!--<![endif]-->
+
+ </div>
+
+ <p>
+ DRAW DEBUG SHIT TO SCREEN***
+ if (debug) {
+ rectMode(CORNER);
+ noFill();
+ //date
+ text(getTimestamp(), 5, 15);
+
+ leftSensor.draw();
+
+ fill(255);
+ text("threshold: "+sensorThreshold, 5, height-5);
+ text("xFlowSum: "+of.xFlowSum, width - 150, height - 5); // time (msec) for this frame
+ }
+
+ if (blast) {
+
+ //BLAST OFF!
+ boolean hit = false;
+ grab = false;
+ //update the reference image on the sensors
+ leftSensor._image = grabImage;
+ if (doGifs){
+ if (of.xFlowSum < flowThreshold) {
+ if (!recordGif) {
+ gifExport = new GifMaker(this, getTimestamp()+".gif");
+ gifExport.setRepeat(0); // make it an "endless" animation
+ }
+ //start recording gif
+ gifExport.setDelay(40);
+ gifExport.addFrame();
+ recordGif = true;
+ }
+ else if (recordGif) {
+ //stop recording gif
+ gifExport.finish();
+ recordGif = false;
+ // gifExport = new GifMaker(this, "export.gif");
+ }}
+
+ hit = leftSensor.checkHitArea();
+ if (hit) {
+ leftSensor.reset();
+
+ if (of.xFlowSum < flowThreshold) {
+ grab = true;
+ }
+ }
+ }
+}
+
+void mousePressed() {
+ leftSensor._r.x = mouseX;
+ leftSensor._r.y = mouseY;
+ ignoreSensor = true;
+}
+
+void onHit() {
+ //IS THE CAMERA TIMER NEEDED HERE?
+ if (cameraTimer.isFinished()) {
+ takePicture();
+ cameraTimer.start();
+ }
+}
+
+String getTimestamp() {
+ String filename = "";
+ filename += String.valueOf(year());
+ filename += "-";
+ filename += String.valueOf(month());
+ filename += "-";
+ filename += String.valueOf(day());
+ filename += "-";
+ filename += String.valueOf(hour());
+ filename += "-";
+ filename += String.valueOf(minute());
+ filename += "-";
+ filename += String.valueOf(second());
+ return filename;
+}
+
+void takePicture() {
+
+ /* PGraphics pg = createGraphics(grabImage.width, grabImage.height, P2D); // I create a PGraphics from it
+ pg.loadPixels();
+ grabImage.loadPixels();
+ for (int i = 0; i < grabImage.pixels.length; i++)
+ {
+ pg.pixels = grabImage.pixels;
+ }
+
+ </p>
+
+ <p>
+ Source code: <a href="StyleBlasterGrabber.pde">StyleBlasterGrabber</a> <a href="MotionSensor.pde">MotionSensor</a> <a href="OpticalFlow.pde">OpticalFlow</a> <a href="timer.pde">timer</a>
+ </p>
+
+ <p>
+ Built with <a href="http://processing.org" title="Processing.org">Processing</a>
+ </p>
+ </div>
+ </body>
+</html>
View
BIN  processing/StyleBlasterGrabber/applet/loading.gif
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  processing/StyleBlasterGrabber/applet/opengl.jar
Binary file not shown
View
BIN  processing/StyleBlasterGrabber/applet/postToWeb.jar
Binary file not shown
View
29 processing/StyleBlasterGrabber/applet/timer.pde
@@ -0,0 +1,29 @@
+
+class Timer {
+
+ int savedTime; // When Timer started
+ int totalTime; // How long Timer should last
+
+ Timer(int tempTotalTime) {
+ totalTime = tempTotalTime;
+ }
+
+ // Starting the timer
+ void start() {
+ // When the timer starts it stores the current time in milliseconds.
+ savedTime = millis();
+ }
+
+ // The function isFinished() returns true if 5,000 ms have passed.
+ // The work of the timer is farmed out to this method.
+ boolean isFinished() {
+ // Check how much time has passed
+ int passedTime = millis()- savedTime;
+ if (passedTime > totalTime) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
+
View
BIN  processing/StyleBlasterGrabber/applet/video.jar
Binary file not shown
View
BIN  processing/StyleBlasterGrabber/application.linux32/lib/StyleBlasterGrabber.jar
Binary file not shown
View
37 processing/StyleBlasterGrabber/application.linux32/source/StyleBlasterGrabber.pde
@@ -23,20 +23,19 @@ byte[] imgBytes;
PImage grabImage;
GifMaker gifExport;
-MotionSensor leftSensor, rightSensor;
+MotionSensor leftSensor;
//SETUP VARS
String version = "1.5";
int startHour = 7; //am
int endHour = 16; //3:59pm
int endMinute = 25;
-int sensorBuffer = -220;
-int sensorBufferY = 50;
String uploadURL = "http://styleblaster.herokuapp.com/upload";
int camWidth;
int camHeight = 720;
int sensorThreshold = 13;
-int flowThreshold = -220;
+int flowDirection = -1; //-1 = right to left, 1 = left to right
+int flowThreshold = 220;
float sensorRes = 1;
public void setup() {
@@ -80,7 +79,6 @@ public void setup() {
//initialize the hit areas
leftSensor = new MotionSensor();
- rightSensor = new MotionSensor();
of = new OpticalFlow(cam);
@@ -128,7 +126,7 @@ void draw() {
}
else {
if (grab) {
- println("!!!HIT!!! @ : "+rightSensor._bDiff);
+ println("!!!HIT!!! @ : ");
fill(255, 0, 0);
onHit();
}
@@ -147,7 +145,6 @@ void draw() {
text(getTimestamp(), 5, 15);
leftSensor.draw();
- rightSensor.draw();
fill(255);
text("threshold: "+sensorThreshold, 5, height-5);
@@ -161,7 +158,10 @@ void draw() {
grab = false;
//update the reference image on the sensors
leftSensor._image = grabImage;
+
+ //GIF EXPORT*********START
if (doGifs){
+
if (of.xFlowSum < flowThreshold) {
if (!recordGif) {
gifExport = new GifMaker(this, getTimestamp()+".gif");
@@ -178,12 +178,22 @@ void draw() {
recordGif = false;
// gifExport = new GifMaker(this, "export.gif");
}}
+//GIF EXPORT**********END
hit = leftSensor.checkHitArea();
if (hit) {
leftSensor.reset();
-
- if (of.xFlowSum < flowThreshold) {
+ boolean dir = false;
+ if(flowDirection == -1){
+ //right to left
+ dir = of.xFlowSum < flowThreshold*flowDirection;
+ }
+ else{
+ //left to right
+ dir = of.xFlowSum > flowThreshold;
+ }
+
+ if (dir) {
grab = true;
}
}
@@ -193,14 +203,9 @@ void draw() {
void mousePressed() {
leftSensor._r.x = mouseX;
leftSensor._r.y = mouseY;
- // rightSensor._r.x = mouseX+rightSensor._r.width;
- // rightSensor._r.y = mouseY;
- // rightSensor._r.y = mouseY+sensorBufferY;
ignoreSensor = true;
}
-
-
void onHit() {
//IS THE CAMERA TIMER NEEDED HERE?
if (cameraTimer.isFinished()) {
@@ -265,19 +270,17 @@ void keyPressed() {
//increase the threshold
sensorThreshold += 1;
leftSensor._thresh = sensorThreshold;
- rightSensor._thresh = sensorThreshold;