Volledige versie bekijken : BitmapData.threshold en Video stream
Dauntless
%Europe/Berlin %538 %2005, 13:55
Haai!
Ben eindelijk eens wat aan het testen met Flash 8. Nu wou ik een motion detection scriptje maken...
Voorlopig had ik dit:
import flash.display.*;
import flash.geom.Rectangle;
import flash.geom.Point;
camStream.attachVideo(Camera.get());
var snapShot:BitmapData = new BitmapData(camStream._width, camStream._height);
var oldSnapShot:BitmapData = new BitmapData(camStream._width, camStream._height);
var tempSnapShot:BitmapData = new BitmapData(camStream._width, camStream._height);
var depth:Number = 0;
this.createEmptyMovieClip("snapShotViewer", 1);
snapShotViewer.attachBitmap(snapShot, 1);
this.createEmptyMovieClip("hitOverlay", 2);
var overlay:Array = new Array();
for (var y:Number = 0; y < 10; y++)
{
overlay[y] = new Array();
for (var x:Number = 0; x < 10; x++)
{
var tile:MovieClip = hitOverlay.attachMovie("mc_hitOverlay", "hitOverLay" + x + "_" + y, depth++);
tile._x = x * (camStream._width / 10);
tile._width = camStream._width / 10;
tile._y = y * (camStream._height / 10);
tile._height = camStream._height / 10;
tile._visible = false;
overlay[y][x] = tile;
}
}
var interval = setInterval(takeSnapShot, 300);
function takeSnapShot()
{
snapShot.draw(camStream);
tempSnapShot = snapShot.clone();
tempSnapShot.draw(oldSnapShot, new Matrix(), null, "difference");
for (var y:Number = 0; y < 10; y++)
{
for (var x:Number = 0; x < 10; x++)
{
var rect:Rectangle = new Rectangle(x * (camStream._width / 10), y * (camStream._height / 10), (camStream._width / 10), (camStream._height / 10));
var nPixels:Number = tempSnapShot.threshold(tempSnapShot, rect, new Point(0, 0), "<=", 0xeeeeeeee);
trace("->"+nPixels);
}
}
oldSnapShot = snapShot.clone();
}
Het id: 2 beelden over elkaar leggen met difference effect en dan per sectie checken hoeveel pixels er zwart zijn (die dus veranderd zijn). Als dat meer dna 75% van het vlak is ga ik er dan van uit gaan dat het beweegt, maar dan moet eerst die nPixels trace goed zijn... En die geeft altijd het zelfde weer...
Iemand een id ?
TheDutch
%Europe/Berlin %729 %2005, 18:30
Kan je je FLA even toevoegen zodat ik kan testen? :).
Dauntless
%Europe/Berlin %730 %2005, 18:31
Er staat eigenlijk alleen een video object op de stage... Maar 'k zal hem hier ff zetten :).
(Ps: TheDutch, jij was nu exact degene van wie ik dacht dat hij me zou helpen ;) ).
TheDutch
%Europe/Berlin %757 %2005, 19:11
Is dit hoe het moet werken Dauntless?
Dauntless
%Europe/Berlin %762 %2005, 19:17
Ongeveer wel, alleen dat ik het dan per tegel wil bekijken ...
mag ik de .fla ? :#
Wel vreemd dat hij altijd iets geeft tussen 19000 - 20000, maar als ik het kleiner bekijk zal het wel lukken :).
TheDutch
%Europe/Berlin %762 %2005, 19:18
Zometeen, nog eventjes die tegeltjes voor je bekijken ;).
Dauntless
%Europe/Berlin %763 %2005, 19:19
Zometeen, nog eventjes die tegeltjes voor je bekijken ;).
Maar dat doe ik zelf wel :). Da's gewoon die rectangle dan per square zetten... Plz niet te veel doen :D Dan is de fun er af :).
TheDutch
%Europe/Berlin %765 %2005, 19:22
Ok, dat de tegeltjes het niet deden was omdat ik wat dingen eruit gesloopt had :#.
Aanpassingen om het werkende te krijgen:
1. setTimeout moet setInterval zijn.
2. Je color argument van threshold() heb ik veranderd naar 0xFF111111, aangezien dat de waarde is die gelijk is aan bijna zwart.
Dit was trouwens voor mij ook de eerste keer dat ik met webcams en BitmapData API werkte, best geinig! Je hebt me door jouw probleem aan het denken gezet en ga er binnenkort zeker ook eens goed mee stoeien ;).
Fijn dat ik je kon helpen man! 8D
Dauntless
%Europe/Berlin %773 %2005, 19:33
Ja, die setInterval had ik in setTimeout veranderd omdat ik anders m'n traces niet kon volgen :D. (Ook logisch dat hij met setTimeout niet werkt omdat er dan nog geen 'oldSnapShot' hebt...).
Dus het enige wat mis was was de kleur? :D Cool, dan zat ik toch al dicht in de buurt :).
Bedankt, en je reputatie punten gaan omhoog :p.
TheDutch
%Europe/Berlin %774 %2005, 19:35
Ja, het was inderdaad alleen maar de kleur. Soms ligt het zo dichtbij dat je het gewoon niet ziet :).
Bedankt voor de puntjes! Haha :P.
Dauntless
%Europe/Berlin %779 %2005, 19:42
Hij werkt wel niet zo goed :(.
De bedoeling is dus dat hij waarneemt hoeveel pixels er verandert zijn... Maar ik krijg nu traces van 0 tot max 20 ... Hoe ben jij aan die 19 000 geraakt?? Lijkt me dat ik nog altijd iets mis doe ...
var interval = setInterval(takeSnapShot, 3000);
function takeSnapShot()
{
snapShot.draw(camStream);
tempSnapShot = snapShot.clone();
tempSnapShot.draw(oldSnapShot, new Matrix(), null, "difference");
for (var y:Number = 0; y < 20; y++)
{
for (var x:Number = 0; x < 20; x++)
{
var rect:Rectangle = new Rectangle(x * (camStream._width / 20), y * (camStream._height / 20), (camStream._width / 20), (camStream._height / 20));
var nPixels:Number = tempSnapShot.threshold(tempSnapShot, rect, new Point(0, 0), "<=", 0xFF111111);
trace("->"+nPixels);
overlay[y][x]._visible = (nPixels > 5)
}
}
oldSnapShot = snapShot.clone();
}
TheDutch
%Europe/Berlin %784 %2005, 19:50
Die 19.000 was zonder jouw tegeltjes :).
Ik zal eens even kijken voor je, alleen ik krijg niet alles terug tussen de 0 en 20.
Dauntless
%Europe/Berlin %786 %2005, 19:52
Ik bekijk die bitmap afbeelding gewoon in deeltjes ... In principe, als ik alles dan zou optellen zou ik ook aan 19 000 moeten graken... Maar 'k graak aan 200 [:o)] . :p
TheDutch
%Europe/Berlin %788 %2005, 19:54
Vergeet niet dat 19.000 alleen is wanneer zowat alles veranderd op je webcam. De achtergrond blijft stil dus die pixels veranderen niet.
Dauntless
%Europe/Berlin %789 %2005, 19:57
Hoe the hell graak jij dan aan 19 000 ?? :p (19 000 + nPixels ? :D)
TheDutch
%Europe/Berlin %794 %2005, 20:04
De rede is dat je kleur op bijna zwart staat en als iets dus niet donker is op de webcam, dan registreert ie het ook niet. Verander FF111111 eens naar FF555555. Dan zul je zien dat hij meer detecteerd of wel gevoeliger is voor (lichts)veranderingen.
Wanneer je (nPixels > 5) veranderd naar (nPixels > 0) detecteerd ie ook meer. Waarom ik trouwens aan de 19.000 kwam is omdat ik in een donkere hobby-kamer zit ;).
Zet je interval trouwens eens op 100 dan zul je het nog leuker/beter zien :).
TheDutch
%Europe/Berlin %795 %2005, 20:05
Wanneer je (nPixels > 5) veranderd naar (nPixels > 0) detecteerd ie ook meer. Waarom ik trouwens aan de 19.000 kwam is omdat ik in een donkere hobby-kamer zit ;).
Dauntless
%Europe/Berlin %803 %2005, 20:17
Hmm, maar ik krijg ook 19000 en met de vakjes krijg ik maar 200 :s :D. Blijkbaar is dit toch niet zo'n goede manier om beweging te registreren :(.
TheDutch
%Europe/Berlin %808 %2005, 20:24
Ik denk het wel hoor, alleen we moeten nog even een stukje langer ermee spelen ;).
Volg anders deze tutorial (http://www.macromedia.com/devnet/flash/articles/webcam_motion.html) eens.
Dauntless
%Europe/Berlin %811 %2005, 20:28
Heb ik al gedaan ;).
TheDutch
%Europe/Berlin %814 %2005, 20:32
Ga dan spelen man! :P
Hoe werkt deze SWF bij jouw?
Dauntless
%Europe/Berlin %863 %2005, 21:43
Die detecteerd nogal veel statisch...
Wat vind je van deze? Verwijder de blokjes dus ;).
TheDutch
%Europe/Berlin %317 %2005, 08:37
Leuk, alleen nu zien beide schermpjes er eigenlijk hetzelfde uit. Zie weinig anders dan een dubbele webcam viewer :).
Dauntless
%Europe/Berlin %654 %2005, 16:42
Hij is precies wat te gevoelig voor overdag :(. Dan maar verder sleutelen :).
TheDutch
%Europe/Berlin %790 %2005, 19:57
Je houdt natuurlijk altijd een licht verschil tussen de omgevingen waar de webcams zich bevinden. Een middenweg is hier de beste oplossing en die moet je even vinden :).
Wellicht is er een methode te schrijven dat jouw progje detecteerd wanneer het wat te licht of te donker is en dat het daar de kleur gevoeligheid op aanpast? Het is maar een gedachte...
Dauntless
%Europe/Berlin %796 %2005, 20:07
Wellicht is er een methode te schrijven dat jouw progje detecteerd wanneer het wat te licht of te donker is en dat het daar de kleur gevoeligheid op aanpast? Het is maar een gedachte...
In principe wel... Terug zo'n threshold doen, checken hoeveel pixels er 'relatief donker' zijn en adhv het niveau bepalen... Maar da's weer war uitgebreider en daar heb ik nu echt geen tijd voor :(. 'k Vind die bitmap + Video stream wel leuk eigenlijk :D. Nu kunnen we flash webcam spelletjes spelen :D 'k heb al een leuke game in gedachte, maar die moet ik dan nog uitwerken :).
Heedless
%Europe/Berlin %643 %2006, 15:26
Even een oud topic nieuw leven inblazen.
Ik heb een webcam beeld met daarnaast een movieclip waaraan een bitmapData object wordt ge-attached.
Nu wil ik dat die bitmapData het beeld van de webcam weergeeft, maar wel eerst alle kleuren er uit gaat filteren behalve wit. Volgens bij moet dit kunnen met threshold, maar zou iemand me uit kunnen leggen hoe ik dat gebruik want ik raak niet echt wijs uit de help enzo :#
Heedless
%Europe/Berlin %790 %2006, 18:58
Was het je eigenlijk nog gelukt om iets leuks te maken hiermee Dauntless? *ging je proberen zei je 2 posts geleden
Dauntless
%Europe/Berlin %792 %2006, 19:00
Neeh, niet echt :(. Wat ik wou was wel gelukt, maar het was niet zo effectief als ik gehoopt had...
Heedless
%Europe/Berlin %796 %2006, 19:07
Kan je hier niet even mee helpen dan? (A)
Zoals ik zei wil ik uit een webcam beeld alles weg filteren behalve wit... maar hoe...
Ik was begonnen met:
//Ik heb een video object dat de webcam laat zien, 'my_video'.
var my_bd = new flash.display.BitmapData(my_cam.width, my_cam.height);
my_bd.draw(my_video);
// en dan zal je my_bd moeten aanpassen
//waardoor hij alles behalve de witte dingen weg laat...
//Ik zat zelf te denken aan copyChannel en het lukte al wel om alleen rood
//te laten zien, maar hoe ik dat gedaan heb... :P
Emveedee
%Europe/Berlin %798 %2006, 19:10
Als het je lukt om alleen rood te laten zien kan t toch niet moeilijk zijn om alleen wit te laten zien?
Of heb je dat met rgb channels gedaan ofzo?
Heedless
%Europe/Berlin %919 %2006, 22:04
nee, het is gedeeltelijk een code die al bestond en die ik over heb genomen maar niet helemaal begrijp :P
o.a. dingen als var my_bd = new flash.display.BitmapData(my_cam.width, my_cam.height);
var green_bd = new flash.display.BitmapData(my_cam.width, my_cam.height);
var blue_bd = new flash.display.BitmapData(my_cam.width, my_cam.height);
my_bd.draw(my_video);
green_bd.copyChannel(my_bd, my_rect, my_pt, 2, 1);
blue_bd.copyChannel(my_bd, my_rect, my_pt, 3, 1);
blue_bd.draw(green_bd, new flash.geom.Matrix(), new flash.geom.ColorTransform(), "lighten");
my_bd.draw(blue_bd, new flash.geom.Matrix(), new flash.geom.ColorTransform(), "subtract");
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.