首先给大家讲一下,为什么我们的摄像头可以识别出标识卡,并在标识卡上出现自己需要的虚拟物体?
原理是这样的,其实总共有个 步骤。第一步:首先我们利用OpenGL的知识来画出一个虚拟物体,用来画出这个虚拟物体的代码要被放在 OpenGL来实现。第二步:制作出一个新模板,也就是制作出一个自己的标识卡。要创建一个新的模板,首先应打印空白的模板(位于下方第一个图)。这只是一个黑方块, 中间是空的白色方块。接着为需要的模板创建一个黑白或者彩色的、适合这个中心的方块 的图像,并把它打印出来。好的模板应该是不对称,而且没有很细微的细节的模板。图 2展示了一下样本模板。将做好的新模板粘在黑方块里
第三步:也就是我们将要重点讲的一步。首先我们要为新的模板命名。我们会以上篇文章中的simpletest为例给大家讲解。
在上篇文章中讲到simpletest的例子中,我们需要把
char *patt_name = "Data/patt.hiro";代码改为char *patt_name = "Data/yourpatt.hiro";
其中,两行代码唯一的不同就是点patt和yourpatt,这就是识别出simpletest的标识卡和我们将要制作的标识卡,当然,你也可以把yourpatt换成别的英文名字。
其中制作标识卡的代码我将贴在下方
#if defined(__sgi)
char *vconf = "-size=FULL";
#elif defined(__linux)
# if defined(AR_INPUT_GSTREAMER)
char *vconf = "videotestsrc";
# elif defined(AR_INPUT_V4L)
char *vconf = "-width=640 -height=480";
# elif defined(AR_INPUT_1394CAM)
char *vconf = "-mode=640x480_YUV411";
# elif defined(AR_INPUT_DV)
char *vconf = "";
# endif
#elif defined(_WIN32)
char *vconf = "Data\\WDM_camera_flipV.xml";
#elif defined(__APPLE__)
char *vconf = "-width=640 -height=480";
#else
char *vconf = "";
#endif
// Image acquisition.
static ARUint8 *gARTImage = NULL;
static ARUint8 *gARTsaveImage = NULL;
// Marker detection.
static int gARTThreshhold = 100;
static ARMarkerInfo* gTarget = NULL;
// Drawing.
static ARParam gARTCparam;
static ARGL_CONTEXT_SETTINGS_REF gArglSettings = NULL;
void lineSeg(double x1, double y1, double x2, double y2, ARGL_CONTEXT_SETTINGS_REF contextSettings, ARParam cparam, double zoom)
{
int enable;
float ox, oy;
double xx1, yy1, xx2, yy2;
if (!contextSettings) return;
arglDistortionCompensationGet(contextSettings, &enable);
if (arglDrawModeGet(contextSettings) == AR_DRAW_BY_TEXTURE_MAPPING && enable) {
xx1 = x1; yy1 = y1;
xx2 = x2; yy2 = y2;
} else {
arParamIdeal2Observ(cparam.dist_factor, x1, y1, &xx1, &yy1);
arParamIdeal2Observ(cparam.dist_factor, x2, y2, &xx2, &yy2);
}
xx1 *= zoom; yy1 *= zoom;
xx2 *= zoom; yy2 *= zoom;
ox = 0;
oy = cparam.ysize - 1;
glBegin(GL_LINES);
glVertex2f(ox + xx1, oy - yy1);
glVertex2f(ox + xx2, oy - yy2);
glEnd();
glFlush();
}
static int setupCamera(ARParam *cparam)
{
ARParam wparam;
char name1[256], name2[256];
int xsize, ysize;
printf("Enter camera parameter filename");
printf("(Dat