多标识AR程序分析(一)

原创 2015年11月17日 21:28:32

在ARToolKit例程中有一个是relation,这个就是标准的多标识AR;
以下是简单的程序分析:
这个程序是在simple.c的基础上进行的,所以这里只是分析不同的部分,对simple不理解的清参考前几篇文章;
1:在这个程序中自定义了一个结构体:

typedef struct {
  char    *patt_name;
  int     patt_id;
  int     model_id;
  int     visible;
  double  width;
  double  center[2];
  double  trans[3][4];
} OBJECT_T;

这个机构体几乎涵盖了做基于标识的AR的一些常规参数;
然后定义了两个变量,初始化了目标的一些值;

OBJECT_T   object[2] = {
             {OBJ1_PATT_NAME, -1, OBJ1_MODEL_ID, 0, OBJ1_SIZE, {0.0,0.0}},
             {OBJ2_PATT_NAME, -1, OBJ2_MODEL_ID, 0, OBJ2_SIZE, {0.0,0.0}}
           };

2:在mainloop函数中增加了以下代码,可以求出多个标识相对于相机的转换矩阵:

 /* check for object visibility *///先检查第一个标识的匹配,计算旋转矩阵,然后计算第二个标识的转换矩阵;若识别了标识,则定义这个标识为可视的。
    for( i = 0; i < 2; i++ ) {
        k = -1;
        for( j = 0; j < marker_num; j++ ) {
            if( object[i].patt_id == marker_info[j].id ) {
                if( k == -1 ) k = j;
                else if( marker_info[k].cf < marker_info[j].cf ) k = j;
            }
        }
        object[i].visible = k;

        if( k >= 0 ) {
            arGetTransMat(&marker_info[k],
                          object[i].center, object[i].width,
                          object[i].trans);
            draw( object[i].model_id, object[i].trans );
        }
    }

3:在这个程序中扩展增加了解释通过可视化的两个标识相对于相机的转换矩阵,如何求出这两个标识之间的转换矩阵,在程序演示中可以看出,在后台打印出这个转换矩阵,随着两个标识的移动,计算出的转换矩阵是变化的。

if( object[0].visible >= 0
     && object[1].visible >= 0 ) {
        double  wmat1[3][4], wmat2[3][4];

        arUtilMatInv(object[0].trans, wmat1);
        arUtilMatMul(wmat1, object[1].trans, wmat2);

        for( j = 0; j < 3; j++ ) {
            for( i = 0; i < 4; i++ ) printf("%8.4f ", wmat2[j][i]);
            printf("\n");
        }
        printf("\n\n");
    }

4:在绘制函数中,针对不同的标识ID绘制不同的目标:

switch( object ) {
      case 0:
        glTranslatef( 0.0, 0.0, 25.0 );
        glutSolidCube(50.0);
        break;
      case 1:
        glTranslatef( 0.0, 0.0, 40.0 );
        glutSolidSphere(40.0, 24, 24);
        break;
      case 2:
        glutSolidCone(25.0, 100.0, 20, 24);
        break;
      default:
        glTranslatef( 0.0, 0.0, 10.0 );
        glutSolidTorus(10.0, 40.0, 24, 24);
        break;
    }

5:最后得出的运行结果是:
这里写图片描述

多标识AR例程分析(二)

这是例程的结果: 1:例程多目标跟踪:一系列标识基于相对位置关系,当至少一个标识可见可以计算出其他标识在相机坐标系中的位置。 基于simple.c实现的程序: 1):在init函数中,导入多目标...
  • chuhang_zhqr
  • chuhang_zhqr
  • 2015年11月17日 16:19
  • 1514

AR多标签识别程序2

1 Basic.h 文件部分 #include #include #include /*函数原型声明*/ //获取空调的温度相关信息 char *getAirInfo(); c...
  • huangzhichang13
  • huangzhichang13
  • 2017年04月10日 17:11
  • 235

AR增强现实-使用测评

1.太虚AR ------------ 识别稳定性:★★☆☆☆ 识别距离:★★★☆☆ 易用性:★★★★★ 功能性:★★☆☆☆ 识别多目标:√ ------------ 评:能多目标,这点很多AR都没有...
  • u014528558
  • u014528558
  • 2016年02月17日 10:23
  • 2201

从零构建AR APP新手教程【U3D篇】(2)-动态修改识别目标和3D物体

学习AR应用开发有一段时间了,自己开发了一款简单的APP来练手,在这里分享给大家。 APP链接:https://www.coolapk.com/apk/173761 经过上一篇教程《从零构...
  • dehang0
  • dehang0
  • 2018年01月20日 20:33
  • 44

AR多标签识别

在ARToolKit5的基础上,对check_id.c文件进行修改,对识别到的标签添加相对应的文字显示信息。代码有两个c文件组成keydakMAR.c和BasicInfo.c keydakMAR.c...
  • huangzhichang13
  • huangzhichang13
  • 2017年05月08日 18:26
  • 736

基于标记的AR的opencv实现(一)

最近学习AR,买了本Mastering OpenCV,这书上有两个AR的例子,这里先分析的是第二章基于标识的AR,书中是使用Xcode给iphone或者ipad写的,本文是在linux系统上vim实...
  • chuhang_zhqr
  • chuhang_zhqr
  • 2015年11月25日 11:33
  • 10463

AR在ios中的几种实现方法

现在不少移动端加入了AR的功能作为功能的拓展与补充。如淘宝过年期间的AR福字扫描,人脸识别,还有一个AR的小游戏等等。那么我们今天就说几个可以在苹果移动端实现AR功能的解决方案。1、利用第三方AR开发...
  • baidu_33735542
  • baidu_33735542
  • 2017年02月13日 10:28
  • 6100

多标识AR程序分析(一)

在ARToolKit例程中有一个是relation,这个就是标准的多标识AR;  以下是简单的程序分析:  这个程序是在simple.c的基础上进行的,所以这里只是分析不同的部分,对simple不...
  • BBZZ2
  • BBZZ2
  • 2016年11月13日 21:56
  • 849

AR多标签识别程序1

#include #include #include #ifndef __APPLE__ #  ifdef _WIN32 #    include #  endif #  include #...
  • huangzhichang13
  • huangzhichang13
  • 2017年04月10日 16:59
  • 818

AR多标签识别3

需求缘起:领导说使用ARtToolKit识别出barCode后,根据barcode的所在的实际位置和barcode相对应的产品尺寸,给产品所在平面画一方框给产品做上标记,并给产品添加相对应的描述信息。...
  • huangzhichang13
  • huangzhichang13
  • 2017年05月17日 18:04
  • 835
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多标识AR程序分析(一)
举报原因:
原因补充:

(最多只允许输入30个字)