0
点赞
收藏
分享

微信扫一扫

FLARtoolkit技巧:使用彩色marker

捌柒陆壹 2023-05-09 阅读 157


彩色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.
现在你知道了所有概念。我们跳过所有麻烦的东西,看看效果或者下载代码吧!

AR技术群:75858605



举报

相关推荐

0 条评论