zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    关于iterator的一点疑惑
    shuffle()方法
    List简单使用笔记
    Arrays.asList()
    多项式ADT(数组存储多项式系数和指数)笔记
    《数据结构与算法分析C语言描述》源码网盘分享
    C语言实现链表
    typedef的用法
    #ifndef的用法
    mysql创建数据库和数据表模板
  • 原文地址:https://www.cnblogs.com/akweb/p/13331948.html
Copyright © 2011-2022 走看看