介绍一个新模块:Gsub_Lite是优化版本的Gsub,更有效,使用流水线方式,捕获视频->视频处理模块->AR模块->Gsub模块->增强现实输出。可用别的三维可视化实体模拟软件代替Gsub。
这个程序与simple几乎是一样的,只是在键盘响应上多出一个c键,这个c键可以选择模式:
包括连续模式和单帧模式。两者在求转换矩阵时有区别,连续模式就是使用arGetTransMatCout函数,单帧模式使用arGetTransMat求转换矩阵。
if( key == 'c' ) {
printf("*** %f (frame/sec)\n", (double)count/arUtilTimer());
count = 0;
mode = 1 - mode;
if( mode ) printf("Continuous mode: Using arGetTransMatCont.\n");
else printf("One shot mode: Using arGetTransMat.\n");
}
arGetTransMat:计算相机位置和检测到的标识之间的转换矩阵,例如计算相机相对于已跟踪标识的位置和方位。输入:marker_info:由arDetectMarker产生的结构体,包含有检测到的标识相对于相机的位置和方位的参数;center:标识的物理中心,这个函数假定标识在2维平面,z轴向下,所以角顶点位置能被呈现在2D平面上,标识的角顶点位置顺时针指明;width:标识的大小,因为是正方形标识,宽度就代表了大小,mm表示;conv:从标识到摄像机的转换矩阵,代表两者真实的相对位置。
ArGetTransMatCont:应用历史函数计算相机位置;在检测出的标识和真实相机上计算转换矩阵,比如相机相对于被跟踪的标识的位置和方向。可以在先前的值上面进行操作,结果会更稳定。减少抖动。
输入:arDetectMarker产生的标识信息结构体,包含有检测到的标识相对于相机的位置和方位;先前获得的转换矩阵;center:标识的物理中心,这个函数假定标识在2维平面,z轴向下,所以角顶点位置能被呈现在2D平面上,标识的角顶点位置顺时针指明;width:标识的大小,因为是正方形标识,宽度就代表了大小,mm表示;conv:从标识到摄像机的转换矩阵,代表两者真实的相对位置。
返回:0。
arDetectMarkerLite:与arDetectMarker对应,只是少了错误校正函数,但是运行快一点。
实际程序中当选择了模式1,或者前一帧没有检测到标识图像时,用arGetTransMat;否则用arGetTransMatCont。
if( mode == 0 || contF == 0 ) {
arGetTransMat(&marker_info[k], patt_center, patt_width, patt_trans);
}
else {
arGetTransMatCont(&marker_info[k], patt_trans, patt_center, patt_width, patt_trans);
}
contF = 1;
总之,后者更好用吧。