FLARtoolkit技巧:使用彩色marker



彩色marker——黑白marker太单调了
越来越多的AR程序出现了,但似乎所有人都在用黑白marker。也许大众还没厌倦黑白方格,但如果能用其他颜色,我们就可以把现实中更漂亮、更灵活的物体作为marker。

提高marker识别的性能
内置的marker识别算法有个特征,屏幕中跟marker颜色相同部分的像素越少,识别越快。我们用黑marker的时候,识别程序会浪费很多时间处理非marker部分的像素。如你所能想到的,现实中黑色物体是很普遍的(特别是我们有黑头发的中国人)。因此,如果marker少用跟现实物体的颜色,识别程序会忽略大部分非marker区域的处理。

用FLARtoolkit怎样做到呢?
我们需要使用FLARtoolkit的底层,所以要创建一个自己的识别类。也许你没有看过FLARtoolkit内部的类(因为使用FLARmanager容易得多),有两个识别类: FLARSingleMarkerDetector和FLARMultiMarkerDetector。正如他们的名称一样,一个用作单marker识别,另一个用作多marker识别。为了简单化,我只会写一个识别单一红色marker的类。我们先把所有FLARSingleMarkerDetector的代码复制到一个新的类,我把它叫做FLARSingleRedMarkerDetector。


原翻译("
我们可以这样得到一个IFLARRgbRaster包装的BitmapData:
public function detectMarkerLite(i_raster:IFLARRgbRaster, i_threshold:int):BooleanIFLARRgbRaster
我们可以这样用,包含一个BitmapData类:
var srcImg:BitmapData = (i_raster as FLARRgbRaster_BitmapData).bitmapData;
");
修改的
要识别marker,我们要用detectMarkerLite方法:
public function detectMarkerLite(i_raster:IFLARRgbRaster, i_threshold:int):Boolean

我们可以这样得到,一个实现IFLARRgbRaster接口的BitmapData类:
var srcImg:BitmapData = (i_raster as FLARRgbRaster_BitmapData).bitmapData;

原来,这个方法用一个过滤算法来提取黑色区域,然后把结果送给其它类去处理。你可能也想到,我们只改写过滤算法就可以了。本来黑色区域会变成白色,其他部分会变成黑色而被忽略。现在我们想识别红色marker,所以要把红色区域边白,其他区域边黑。你可以用ColorTransform类,但我现在用PixelBender类。

My version of kernel is:



kernel extractRedARMarker
< namespace : "net.onthewings.filters";
vendor : "Andy Li";
version : 1;
description : "used for FLARtoolkit, pre-proccess for red marker.";
>
{
input image4 src;
output pixel4 dst;

parameter float threshold<
       minValue: 0.0;
       maxValue: 1.0;
       defaultValue: 0.4;
       description:"decrease to increase likelihood of marker detection.";
>;

void
evaluatePixel()
{
       float4 p = sampleNearest(src,outCoord());
       float sum = p.r+p.g+p.b;
       float val = p.r - (p.g + p.b)*0.5;

       if (val+(1.0-(sum/3.0))*0.1 <= threshold) {
         val = 0.0;
       } else {
         val = 1.0;
       }
       dst = float4 (val,val,val,1);
}
}

注意,我把深红色传给过滤算法,因为我发现通常摄像头的图像太暗。

To use the finished detector class:


tempFLARRgbRaster_BitmapData.bitmapData.draw(videoDisplay);
if (detector.detectMarkerLite(tempFLARRgbRaster_BitmapData,170)){
detector.getTransformMatrix(lastDetectionResult);
//FLARPVGeomUtils is from FLARmanager
overlay3dObj.transform = FLARPVGeomUtils.convertFLARMatrixToPVMatrix(lastDetectionResult);
overlay3dObj.visible = true;
} else {
overlay3dObj.visible = false;
}
render();


Now you get all the concepts. So let’s skip all the boring stuff and see it in action. Or get the finished codes.
现在你知道了所有概念。我们跳过所有麻烦的东西,看看效果或者下载代码吧!

原文地址:http://www.artoolkit.net/viewthread.php?tid=302&extra=page%3D1

AR技术群:75858605

posted @ 2010-01-04 17:05  Akweb  阅读(99)  评论(0编辑  收藏  举报