彩色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