Flash Player 10: Pixel Bender Realtime Color Keying
27
Mai
2008

Um die Arbeitsweise mit Pixel Bender (ehemals Hydra) auszuprobieren, habe ich einen Filter geschrieben, der in Echtzeit ein Green-Screen-Video filtert. Über einen Threshold-Regler lässt sich die Stärke des Filters regeln. Über drei Slider (RGB-Farbwert) kann die Keyfarbe festgelegt werden.
Hier das Beispiel zum Anschauen: Demo
Hinweis: Um das Beispiel zu betrachten, wird der Flash Player 10 (zurzeit in der Betaphase) benötigt.
Pixel Bender Colorkey Filter
Der Colorkey-Filter hat eine RGB-Farbe als Grundlage, also die Keyfarbe. Alle Werte, die dieser Farbe exakt entsprechen werden transparent gemacht. Des Weiteren werden alle ähnlichen Farben unsichtbar gemacht, wobei die Toleranz über den "Threshold" genauer geregelt werden kann.
Mit weiteren Bearbeitungsschritten wie Kantenglättung, etc. würde sich die Qualität des Filters sicherlich um einiges optimieren lassen. Außerdem ist das Grün im Beispielvideo relativ dunkel und wäre bei gutem Footage wesentlich besser zu filtern.
Der Filtercode für Pixel Bender lautet:
CODE:
-
/*****************************************************************************
-
*
-
* by Florian Plag
-
* www.video-flash.de
-
*
-
*****************************************************************************/
-
-
<languageVersion: 1.0;>
-
-
// color keying
-
kernel colorKey
-
< namespace : "AIF";
-
vendor : "Florian Plag";
-
version : 1;
-
description : "Color keying";>
-
{
-
input image4 src;
-
-
output float4 dst;
-
-
// Threshold
-
parameter float threshold
-
<minValue: 0.0;
-
maxValue: 1.0;
-
defaultValue: 0.1;>;
-
-
// key color (RGB)
-
parameter float3 keyColor;
-
-
-
void
-
evaluatePixel()
-
{
-
// Obtain the input pixel color
-
float4 inputColor = sampleNearest(src, outCoord());
-
-
// tolerance for key color
-
float3 keyCMinusThr = float3 ( (keyColor.r - threshold), (keyColor.g - threshold), (keyColor.b - threshold));
-
float3 keyCPlusThr = float3 ( (keyColor.r + threshold), (keyColor.g + threshold), (keyColor.b + threshold));
-
-
// if color is the key color (or similar)
-
if ( ((inputColor.r> keyCMinusThr.r) && (inputColor.r <keyCPlusThr.r)) && ((inputColor.g> keyCMinusThr.g) && (inputColor.g <keyCPlusThr.g)) && ((inputColor.b> keyCMinusThr.b) && (inputColor.b <keyCPlusThr.b)) ) {
-
// transparent pixel
-
dst.rgba = float4(1.0, 1.0, 0.0, 0.0);
-
}
-
else {
-
// keep source pixel
-
dst.rgb = inputColor.rgb;
-
// and source alpha
-
dst.a = inputColor.a;
-
}
-
-
-
}
-
}
Wie nutzt man Pixel Bender in Flash/Flex?
Anhand des Beispiels sieht man, wie man einen Pixel Bender Filter in Flex verwendet.
XML:
-
<?xml version="1.0" encoding="utf-8"?>
-
<mx:Application
-
xmlns:mx="http://www.adobe.com/2006/mxml"
-
xmlns:test="*"
-
width="800" height="800" backgroundImage="bgpattern.png"
-
creationComplete="creationCompleteHandler()"
-
>
-
-
-
<mx:Script>
-
<![CDATA[
-
-
import flash.display.*;
-
import flash.events.*;
-
import flash.net.*;
-
import flash.filters.*;
-
import flash.utils.*;
-
-
private var shader:Shader;
-
private var shaderFilter:ShaderFilter;
-
private var myVideo:Video;
-
private var ns:NetStream;
-
-
-
public function creationCompleteHandler():void {
-
-
-
// new video
-
myVideo = new Video(400,300);
-
myUIComponent.addChild(myVideo);
-
var nc:NetConnection = new NetConnection();
-
nc.connect(null);
-
ns = new NetStream(nc);
-
ns.client = new Object();
-
myVideo.attachNetStream(ns);
-
ns.play("green-screen.flv");
-
-
-
[Embed(source="colorkey.pbj", mimeType="application/octet-stream")]
-
var Filter:Class;
-
shader = new Shader(new Filter());
-
-
updateFilter();
-
-
}
-
-
-
-
private function updateFilter():void {
-
-
// set threshold (pixel bender filter parameter)
-
shader.data.threshold.value = [mySlider.value];
-
-
// set key color (pixel bender filter parameter)
-
shader.data.keyColor.value = [mySliderR.value, mySliderG.value, mySliderB.value];
-
-
// new shaderFilter
-
shaderFilter = new ShaderFilter();
-
shaderFilter.shader = shader;
-
-
// apply filter
-
if (myCheckBox.selected == true) {
-
myUIComponent.filters = [shaderFilter];
-
}
-
else {
-
myUIComponent.filters = null;
-
}
-
}
-
-
-
-
]]>
-
-
</mx:Script>
-
-
-
<mx:HBox>
-
-
-
<mx:Panel title="Color keying with Pixel Bender" width="300" height="180"
-
headerColors="[0xc6d381, 0xc6d381]" paddingLeft="10" paddingTop="10" id="myParamPanel">
-
-
<mx:HBox>
-
<mx:Label text="Threshold"/>
-
<mx:HSlider id="mySlider" value="0.2" maximum="1.0" minimum="0.0" thumbRelease="updateFilter();" />
-
</mx:HBox>
-
-
<mx:HBox>
-
<mx:Label text="R"/>
-
<mx:HSlider id="mySliderR" value="0.37" maximum="1.0" minimum="0.0" thumbRelease="updateFilter();" />
-
</mx:HBox>
-
-
<mx:HBox>
-
<mx:Label text="G"/>
-
<mx:HSlider id="mySliderG" value="0.52" maximum="1.0" minimum="0.0" thumbRelease="updateFilter();" />
-
</mx:HBox>
-
-
<mx:HBox>
-
<mx:Label text="B"/>
-
<mx:HSlider id="mySliderB" value="0.25" maximum="1.0" minimum="0.0" thumbRelease="updateFilter();" />
-
</mx:HBox>
-
-
<mx:HBox>
-
<mx:CheckBox id="myCheckBox" label="Color key active" selected="true" change="updateFilter();" />
-
</mx:HBox>
-
-
</mx:Panel>
-
-
-
</mx:HBox>
-
-
<mx:VBox>
-
<mx:UIComponent id="myUIComponent" width="400" height="300" />
-
<mx:Button click="ns.pause()" label="Pause video"/>
-
<mx:Button click="ns.resume()" label="Continue video"/>
-
<mx:Button click="ns.seek(0);" label="Reset video"/>
-
</mx:VBox>
-
-
-
</mx:Application>
Link: Beispiel anschauen
7 Kommentare zum Beitrag "Flash Player 10: Pixel Bender Realtime Color Keying"
WOW! Gute Arbeit!
Die Demo funktioniert leider nicht.
Hast du die Flash Player 10 Beta installiert? Bei mir funktioniert es :-)
wow! Impressed nice one
[...] Read more [...]
Nice filter, impressive! I have made a pixel bender filter that changes the individual RGB color channels to any given color. This way you can set a picture to match a given set of colors. You can try it out and download it at http://last.instinct.se/graphics-and-effects/channel-colorizer-demo-application/554
Keep up the good work!
/Klas
Good god this is beautiful, you have saved me!
Schreibe einen Kommentar