I found some code… I have adapted it slightly (following watching a Dan Shiffman Processing video) - but can’t get it to work.
Here is the page I’ve created: Webcam motion detection
In the Shiffman video online - we see an outline of the ‘mover’ on the screen (the pixels turning black) but on mine - we never see any movement. In fact we only see a blank page.
The update I made was to introduce the distNew() function instead of using the dist() function (I kept getting an advisory message saying:
p5.js says: dist() was expecting at least 4 arguments, but received only 3.
and after a while - the browser crashes and my Chromebook shuts down.)
Any suggestions?
// Variable for capture device
var video;
// Previous Frame
var prevFrame;
// How different must a pixel be to be a “motion” pixel
var threshold = 50;function setup() {
createCanvas(300, 150);
//frameRate=(10); // just trying to slow it down!
pixelDensity(1);
video = createCapture(VIDEO);
vw=video.width;// just seeing what the values are
vh=video.height;// just seeing what the values are
video.size(width, height);
video.hide();
// Create an empty image the same size as the video
prevFrame = createImage(video.width, video.height);
}function draw() {
//image(prevFrame, 0, 0);loadPixels();
video.loadPixels();
prevFrame.loadPixels();// Begin loop to walk through every pixel
for (var x = 0; x < video.width; x++) {
for (var y = 0; y < video.height; y++) {// Step 1, what is the location into the array var loc = (x + y * 200) * 4; // Step 2, what is the previous color var r1 = prevFrame.pixels[loc]; var g1 = prevFrame.pixels[loc + 1]; var b1 = prevFrame.pixels[loc + 2]; // Step 3, what is the current color var r2 = video.pixels[loc]; var g2 = video.pixels[loc + 1]; var b2 = video.pixels[loc + 2]; // Step 4, compare colors (previous vs. current) var diff = distNew(r1, g1, b1, r2, g2, b2); // Step 5, How different are the colors? // If the color at that pixel has changed, then there is motion at that pixel. if (diff > threshold*threshold) { // If motion, display black pixels[loc] = 0; pixels[loc+1] = 0; pixels[loc+2] = 0; pixels[loc+3] = 0; } else { // If not, display white pixels[loc] = 255; pixels[loc+1] = 255; pixels[loc+2] = 255; pixels[loc+3] = 255; } }
}
updatePixels();// Save frame for the next cycle
//if (video.canvas) {
prevFrame.copy(video, 0, 0, video.width, video.height, 0, 0, video.width, video.height); // Before we read the new frame, we always save the previous frame for comparison!
//}}
function distNew(x1,y1,z1,x2,y2,z2){
var d= (x2-x1)(x2-x1)+(y2-y1)(y2-y1)+(z2-z1)*(z2-z1);
return d;
}