如何获取artoolkit camera 获取yuv数据矩阵

7283人阅读
AR:增强现实(3)
ARToolKit Documentation
如果你安装了gnome或KDE桌面环境,也可以直接双击运行simpleTest(不过这样运行看不到错误和输出流信息)。也可以在终端中运行它。如果你安装的是V4L,会显示如下的对话框。
在这个对话框中,你可以设置视频输出的尺寸和格式。需要注意的是,最好使用与ARToolKit定位相同的格式,这样会会一些(RGB)。某些摄像头还允许你改变帧率。默认情况下,该对话框的设置与你先前视频输入的设置相同。此设置可能会引起一些问题(参考).
On MacOS X double click on the simple icon in the bin directory from your mac explorer. A console window will open and when the camera is detected the follow dialog will open. Otherwise start the Terminal program, go the bin directory and run simple.
The default Mac video dialog is really advanced so you can change a lot of elements, like video input, format or setup the video parameters (saturation, brightness). Furthermore, a preview window is displayed that help for the configuration. You need to notice that better the format is similar to ARToolKit tracking format, faster is the acquisition (RGB more efficient).
On SGI you need to use a terminal, go to the bin directory, and run simple.
simpleTest的输出
如果成功了,会显示一个视频窗口(如果遇到什么问题,可以参考、)。当你把摄像头对准标志物的时候(内部印有&hiro&的黑框),在视频窗口里,会看到有一个蓝色的方块出现在标志物上。 下图是运行的截图。当移动标志物的时候,虚拟图像(蓝色方块)会随标志物一起移动。
为了让虚拟物体显示在标志物上,必须能在视频中看到完整的黑框和黑框中的图形。如果看不到虚拟物体,或者它时隐时现,可能是照明的问题。这个问题可以通过修改图像处理历程的阈值来解决。键入&t&,会提示你输入新的阈值。阈值的取值范围为0~255,默认值是100。键入&d&会显示在主窗口下显示阈值图像(如下图)。在阈值图像中,会用红框把可能的定位区域标出来。这样将便于你检查光照和阈值的设置是否合适。
键入&esc&退出程序并打印幀率信息。
simpleTest展示了ARToolKit如何实时计算摄像头的视点,并利用得到的信息准确的把虚拟图像叠加到现实图像当中。下面的章节将会详细讲解这是如何做到的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:22667次
排名:千里之外
转载:10篇
(2)(4)(1)(4)(1)(1)(1)(1)(3)(1)3368人阅读
一. ARToolKit SDK中基于多标示的识别例程:
&&& ART是基于OPENGL和DSVL的增强现实软件包,它遵循OPENGL的运行模式,基于帧循环实现3D图像的渲染,
在每次进入帧循环后做标识物的检测和摄像机的重定位。
&&& 当然这里使用DSVL的视频处理和基于OPENGL的图像处理,都可以用其他方式来代替。比如可以用OSG图形
引擎来完成较为复杂的图像处理,效果会更好,它也是基于OPENGL的接口,也需要在帧循环中处理。
下面的步骤必须在应用程序中采取的主要代码:
#ifdef _WIN32
#include &windows.h&
#include &stdio.h&
#include &stdlib.h&
#ifndef __APPLE__
#include &GL/gl.h&
#include &GL/glut.h&
#include &OpenGL/gl.h&
#include &GLUT/glut.h&
#include &AR/gsub.h&
#include &AR/video.h&
#include &AR/param.h&
#include &AR/ar.h&
#include &AR/arMulti.h&
/* set up the video format globals */
#ifdef _WIN32
char&&&*vconf = &Data//WDM_camera_flipV.xml&;&&&&& //摄像机默认参数
char&&&*vconf = &&;
int&&&&&&&&&&&& xsize,
int&&&&&&&&&&&& thresh = 100;
int&&&&&&&&&&&& count = 0;
char&&&&&&&&&& *cparam_name&&& = &Data/camera_para.dat&;&&& //摄像机特征参数
ARParam&&&&&&&&
char&&&&&&&&&&&&&&& *config_name = &Data/multi/marker.dat&; //标识信息
ARMultiMarkerInfoT& *
static void&& init(void);
static void&& cleanup(void);
static void&& keyEvent( unsigned char key, int x, int y);
static void&& mainLoop(void);
static void&& draw( double trans1[3][4], double trans2[3][4], int mode );
//程序入口
int main(int argc, char **argv)
&//初始化OPENGL
&glutInit(&argc, argv);
&//初始化摄像机参数和显示窗口
&&& init();
&//启动摄像机
&&& arVideoCapStart();
&//注册响应事件函数(分别是鼠标事件、键盘事件、帧循环)&
&&& //实际是用OPENGL的内部事件处理机制,这里只是传递函数指针
&&& argMainLoop( NULL, keyEvent, mainLoop );
&return (0);
//键盘事件响应函数
static void&& keyEvent( unsigned char key, int x, int y)
&&& /* quit if the ESC key is pressed */
&/* 点击ESC退出 */
&&& if( key == 0x1b ) {
&&&&&&& printf(&*** %f (frame/sec)/n&, (double)count/arUtilTimer());
&&//释放资源
&&&&&&& cleanup();
&&&&&&& exit(0);
&//调整二值化闸值&
&&& if( key == 't' ) {
&&&&&&& printf(&*** %f (frame/sec)/n&, (double)count/arUtilTimer());
&&&&&&& printf(&Enter new threshold value (current = %d): &, thresh);
&&&&&&& scanf(&%d&,&thresh); while( getchar()!='/n' );
&&&&&&& printf(&/n&);
&&&&&&& count = 0;
&&& /* turn on and off the debug mode with right mouse */
&/* 调试模式开关,显示二值化图像*/
&&& if( key == 'd' ) {
&&&&&&& printf(&*** %f (frame/sec)/n&, (double)count/arUtilTimer());
&&&&&&& arDebug = 1 - arD
&&&&&&& if( arDebug == 0 ) {
&&&&&&&&&&& glClearColor( 0.0, 0.0, 0.0, 0.0 );
&&&&&&&&&&& glClear(GL_COLOR_BUFFER_BIT);
&&&//交换缓冲区
&&&&&&&&&&& argSwapBuffers();
&&&&&&&&&&& glClear(GL_COLOR_BUFFER_BIT);
&&&&&&&&&&& argSwapBuffers();
&&&&&&& count = 0;
/* main loop */
/* 主循环:完成标示物的检测和位置的重定位,并渲染模型。 */
static void mainLoop(void)
&&& ARUint8&&&&&&&& *dataP
&&& ARMarkerInfo&&& *marker_ //标志信息结构
&&& int&&&&&&&&&&&& marker_
&&& double&&&&&&&&&
&&& int&&&&&&&&&&&&
&&& /* grab a vide frame */
&/* 获取一帧图像 */
&&& if( (dataPtr = (ARUint8 *)arVideoGetImage()) == NULL ) {
&&//调用延时
&&&&&&& arUtilSleep(2);
&//计时复位
&&& if( count == 0 ) arUtilTimerReset();
&&& count++;
&&& /* detect the markers in the video frame */
&/* 检测标识 */
&&& if( arDetectMarkerLite(
&&&&&&&&&&& dataPtr, //帧数据
&&&&&&&&&&&& thresh, //二值化闸值
&&&&&&&& &&marker_info, //标识特征信息
&&&&&&&& &&marker_num&& // 标识数量
&&) & 0 ) {
&&&&&&& cleanup();
&&&&&&& exit(0);
&//为渲染2D或3D对象更新当前摄像机参数
&&& argDrawMode2D();
&&& if( !arDebug ) {
&&&&&&& argDispImage( dataPtr, 0,0 );
&&& else {
&&&&&&& argDispImage( dataPtr, 1, 1 );//调试模式下不显示摄像机图像作为背景
&&&&&&& if( arImageProcMode == AR_IMAGE_PROC_IN_HALF )
&&&&&&&&&&& argDispHalfImage( arImage, 0, 0 );
&&&&&&& else
&&&&&&&&&&& argDispImage( arImage, 0, 0);
&&&&&&& glColor3f( 1.0, 0.0, 0.0 );
&&&&&&& glLineWidth( 1.0 );
&&&&&&& for( i = 0; i & marker_ i++ ) {
&&&&&&&&&&& argDrawSquare( marker_info[i].vertex, 0, 0 );
&&&&&&& glLineWidth( 1.0 );
&//每帧必须调用这个函数,完成诸多功能的支持...
&&& arVideoCapNext();
&//获取摄像机位置
&&& if( (err=arMultiGetTransMat(marker_info, marker_num, config)) & 0 ) {
&&&&&&& argSwapBuffers();
&&& printf(&err = %f/n&, err);
&&& if(err & 100.0 ) {
&&&&&&& argSwapBuffers();
&&& for(i=0;i&3;i++) {
&&&&&&& for(j=0;j&4;j++) printf(&%10.5f &, config-&trans[i][j]);
&&&&&&& printf(&/n&);
&&& printf(&/n&);
&&& argDrawMode3D();
&&& argDraw3dCamera( 0, 0 );//3D模式开关
&&& glClearDepth( 1.0 );
&&& glClear(GL_DEPTH_BUFFER_BIT);
&//将模型绘制到对应位置
&&& for( i = 0; i & config-&marker_ i++ ) {
&&&&&&& if( config-&marker[i].visible &= 0 ) draw( config-&trans, config-&marker[i].trans, 0 );
&&&&&&& else&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& draw( config-&trans, config-&marker[i].trans, 1 );
&&& argSwapBuffers();
//初始化函数
static void init( void )
&&& ARParam&
&&& /* open the video path */
&/* 打开摄像机参数文件 */
&&& if( arVideoOpen( vconf ) & 0 ) exit(0);
&&& /* find the size of the window */
&/* 获取视频窗口大小 */
&&& if( arVideoInqSize(&xsize, &ysize) & 0 ) exit(0);
&&& printf(&Image size (x,y) = (%d,%d)/n&, xsize, ysize);
&&& /* set the initial camera parameters */
&/* 设置摄像机特征参数,这里的参数与摄像机安装和内部参数相关,主要是为了能更好的识别标识物。
&该参数文件可用用标准模版程序得到。 */
&&& if( arParamLoad(cparam_name, 1, &wparam) & 0 ) {
&&&&&&& printf(&Camera parameter load error !!/n&);
&&&&&&& exit(0);
&&& arParamChangeSize( &wparam, xsize, ysize, &cparam );
&//初始化摄像机
&&& arInitCparam( &cparam );
&&& printf(&*** Camera Parameter ***/n&);
&&& arParamDisp( &cparam );
&//读取多标识的定义文件,该文件中记录有各个标识的特征信息和序号。
&&& if( (config = arMultiReadConfigFile(config_name)) == NULL ) {
&&&&&&& printf(&config data load error !!/n&);
&&&&&&& exit(0);
&&& /* open the graphics window */
&/* 打开图像窗口 */
&&& argInit( &cparam, 1.0, 0, 2, 1, 0 );
&&& arFittingMode&& = AR_FITTING_TO_IDEAL;
&&& arImageProcMode = AR_IMAGE_PROC_IN_HALF;
&&& argDrawMode&&&& = AR_DRAW_BY_TEXTURE_MAPPING;
&&& argTexmapMode&& = AR_DRAW_TEXTURE_HALF_IMAGE;
/* cleanup function called when program exits */
/* 当退出程序时回收资源 */
static void cleanup(void)
&&& arVideoCapStop();
&&& arVideoClose();
&&& argCleanup();
//绘制3D模型,这部分完全属于OPENGL的内容
static void draw( double trans1[3][4], double trans2[3][4], int mode )
&&& double&&& gl_para[16];
&&& GLfloat&& mat_ambient[]&&&& = {0.0, 0.0, 1.0, 1.0};
&&& GLfloat&& mat_ambient1[]&&& = {1.0, 0.0, 0.0, 1.0};
&&& GLfloat&& mat_flash[]&&&&&& = {0.0, 0.0, 1.0, 1.0};
&&& GLfloat&& mat_flash1[]&&&&& = {1.0, 0.0, 0.0, 1.0};
&&& GLfloat&& mat_flash_shiny[] = {50.0};
&&& GLfloat&& mat_flash_shiny1[]= {50.0};
&&& GLfloat&& light_position[]& = {100.0,-200.0,200.0,0.0};
&&& GLfloat&& ambi[]&&&&&&&&&&& = {0.1, 0.1, 0.1, 0.1};
&&& GLfloat&& lightZeroColor[]& = {0.9, 0.9, 0.9, 0.1};
&//进入3D绘图模式
&&& argDrawMode3D();
&&& argDraw3dCamera( 0, 0 );
&&& glEnable(GL_DEPTH_TEST);
&&& glDepthFunc(GL_LEQUAL);
&&& /* load the camera transformation matrix */
&/* 加载摄像机转换矩阵 */
&&& glMatrixMode(GL_MODELVIEW);
&&& argConvGlpara(trans1, gl_para);
&&& glLoadMatrixd( gl_para );
&&& argConvGlpara(trans2, gl_para);
&&& glMultMatrixd( gl_para );
&&& if( mode == 0 ) {
&&&&&&& glEnable(GL_LIGHTING);
&&&&&&& glEnable(GL_LIGHT0);
&&&&&&& glLightfv(GL_LIGHT0, GL_POSITION, light_position);
&&&&&&& glLightfv(GL_LIGHT0, GL_AMBIENT, ambi);
&&&&&&& glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor);
&&&&&&& glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash);
&&&&&&& glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny);&
&&&&&&& glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
&&& else {
&&&&&&& glEnable(GL_LIGHTING);
&&&&&&& glEnable(GL_LIGHT0);
&&&&&&& glLightfv(GL_LIGHT0, GL_POSITION, light_position);
&&&&&&& glLightfv(GL_LIGHT0, GL_AMBIENT, ambi);
&&&&&&& glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor);
&&&&&&& glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash1);
&&&&&&& glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny1);&
&&&&&&& glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1);
&&& glMatrixMode(GL_MODELVIEW);
&&& glTranslatef( 0.0, 0.0, 25.0 );
&&& if( !arDebug ) glutSolidCube(50.0);
&&&& else&&&&&&&&& glutWireCube(50.0);
&&& glDisable( GL_LIGHTING );
&&& glDisable( GL_DEPTH_TEST );
二 这个程序使用的标示图像如下:
&&& 其中包括了六个标示,这些标示的特征被记录在六个独体的PATT文件中。加载时不需要一一说明,只需要加载这六个文件
的总说明文件即&marker.dat&即可。
三 标示特征文件&marker.dat&的内部结构:
&&& 这个文件中并没有标示物的具体特征参数,而是他们加载后的识别顺序和对应的特征文件名。
四&程序运行的效果:
五 如果对这个说明还有任何疑问,可以留言。我会尽量补充!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:56551次
排名:千里之外
转载:24篇
评论:14条
(1)(4)(1)(3)(2)(6)(3)(6)学习ARToolkit小记之三 摄像头标定Camera Calibration
利用ARToolkit对摄像头进行标定设ARToolkit应用首先要做的一步,详细内容可以参考官网教程Documentation里面的Calibrating your camera(http://www.hitl.washington.edu/artoolkit/documentation/usercalibration.htm)。在进行摄像头标定之前需要建立ARToolkit的开发环境,具体的内容也可以参考官网教程Documentation里面的Setup ARToolkit(http://www.hitl.washington.edu/artoolkit/documentation/usersetup.htm),这里我们使用的是Windows
7 64位操作系统VS2010来实现的,按照教程中的步骤一步一步来实现,其中在64位系统中配置ARToolkit会遇到一些问题,可参考本人博客的前两则的内容(http://blog.csdn.net/qingyang8513/article/details/和http://blog.csdn.net/qingyang8513/article/details/),里面提供了详细的解决方法,下面是在上述内容完成之后进行的实验。本部分内容只用于个人的学习记录与记录,详细内容请参考官方网站教程。一、开发环境1、操作系统:Windows 7(64位)2、编程环境:Microsoft Visual Studio 20103、ARToolkit版本:ARToolKit-2.72.1二、标定过程1、简介(Introduction)ARToolkit程序默认的摄像机属性保存在摄像机参数文件camera_para.dat中,每次程序执行时都会读取文件的信息。而对于特定的摄像机,我们可以通过简单的摄像头标定技术产生单独的参数文件,当已知摄像头参数,ARToolkit程序就可以在运行时自动矫正摄像头畸变。利用ARToolkit进行摄像头标定的方法有两种,一种是两部标定法,另一种是一步标定法。其中两部标定法相对复杂一点,但是精度会相对较高。下面的两部分将分别采用这两种方法实现摄像头的标定。2、两部标定法(Two StepCalibration)1)标定板打印:patterns文件下打印calib_cpara.pdf和calib_dist.pdf,按照实际尺寸打印,前者是间距40mm网格,后者是6*4间距也为40mm的圆形标定点。打印出来的标定纸平整的固定在硬纸板上,如图一和图二所示。图1&calib_cpara.pdf标定板图2&calib_dist.pdf标定板摄像机内部参数包括图像中心点坐标、镜头畸变参数和摄像机实际焦距,程序calib_dist用于测量图像中心点坐标和镜头畸变参数,而程序calib_cparam用于测量摄像机实际焦距。这两个程序保存在bin文件夹下,其中源文件保存在utils文件夹下。下面首先需要运行calib_dist,然后运行calib_cparam,因为calib_cparam用到了calib_dist程序输出的数据。2)运行calib_dist:a)运行calib_dist程序,使用图2所示的calib_dist标定板;b)点击鼠标左键获取第一幅图像,保证保定板上的所有点都在图像坐标系中;c)选取标定点:用鼠标按照从左到右、从上到下的顺序选取,选取时从标定点的左上角点击右键拉到右下角画一个方框,将标定点框在中间即可。如下图3、图4所示:图3 获取第一幅图像图4 选取标定点(从左到右,从上到下)d)选定标定点的过程中可以使用鼠标右键从新选定;e)选定一幅图像结束之后,点击鼠标左键重新获取一幅图像,按照b)~d)重复操作,建议3~5幅图像(越多也好);f)选取结束之后,点击鼠标右键结束图像的选取,程序自动运行,并计算摄像头图像中心和畸变参数,这需要一段时间,同时程序界面会动态显示计算过程,如图5所示。图5&图像中心和畸变参数计算过程g)结束之后显示计算结果,如图6和图7所示;图6 计算参数结果图7 图像结果显示h)查看所有结果后,程序结束,此时第一步完成。3)运行calib_cparam:a)使用calib_cparam标定板(7条水平线,9条垂直线);b)运行calib_cparam,按照提示输入参数,其中用到了上一步计算出来的参数;c)将标定板放在摄像头前面,保证和摄像头垂直;d)点击鼠标左键,获取一幅图像,此时会出现一条白色的水平线,如图8所示;图8 获取图像e)使用键盘上下方向键移动中间白线,左右方向键调整白线角度,使白线和标定板最上面水平线重合,按下Enter键;f)重复e),绘制所有7条水平线,顺序严格按照从上到下顺序;g)水平线绘制完成后开始绘制垂直线,方法和上面类似,结果如图9所示;图9 绘制网格线h)完成之后,移动标定板远离摄像头100mm,重新获取图像,并重复上述过程,知道结束5幅图像的绘制;i)标定结果如图10所示;图10 实际焦距标定结果j)输入文件名,保存标定参数,标定结束。k)如果需要修改网格大小和一定距离,可以参考calib_cparam_sub.c,修改如下代码即可:inter_coord[k][j][i+7][0] = 40.0*i; inter_coord[k][j][i+7][1] = 40.0*j; inter_coord[k][j][i+7][2] = 100.0*k; *loop_num = 5;3、一步标定法(One Step Calibration)一步标定法的方法和两部标定法第一步的方法相同,只需运行calib_camera2即可。calib_cparam2 Input the length between each markers: 40
----------- Mouse Button Left : Grab image. Right : Quit. -----------标定结束之后,即获得摄像头的参数文件,如果需要使用,只需要将文件名修改为camera_para.dat,并放在bin/Data文件夹下即可。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
在上一个ROS教程视觉文章中,我们使用usb_cam包读入并发布了图像消息,但是图像没有被标定,因此存在畸变.ROS官方提供了用于单目或者双目标定的camera_calibration包.这个包是使用opencv里的张正友标定法,所以如果你有使用opencv标定的经验,可以直接标定,而不使用官方的程序.
官方也给出了单目的标定 ...
/mfryf/archive//2426324.html
一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦距变形参数等,简化的情况是只有f错切=0,变比=1,光心位置简单假设为图像中心),参数已知,那么根据2D投影,就可以估计出R t:空间3D点所在的线就确 ...
一 作用 建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦距变形参数等,简化的情况是只有f错切=0,变比=1,光心位置简单假设为图像中心),参数已知,那么根据2D投影,就可以估计出R t: 空间3D点所在的线就确定了,根据多视图(多视图可以是运动图像)可以重建3D. 如果场景已知,则可以把场景中的虚拟物体投影到2D图像平面(DLT,只要 ...
张正友摄像机标定的研究(MATLAB+OpenCV) 张正友 本科浙大,本来以为是中国人论文是中文呢,哎 张正友的主页: /en-us/um/people/zhang/Calib/ 不过里面的棋盘格跟我的不一样啊,why???,我决定先看看中文的论文吧,我的首要任务是弄清楚输入输出,流程,怎么用吧 m ...
Camera Calibration Toolbox for Matlab:http://www.vision.caltech.edu/bouguetj/calib_doc/ 一些摄像机标定的Matlab工具箱(含Kinect和激光):http://blog.exbot.net/archives/60 kinect深度图与摄像头RGB的标定与配准:http: ...
1° 什么是相机标定(What is Camera Calibration?) 找到影响图像成像过程的内部相机参数: 图像中心(不是width/2, height/2) 焦距长度 行像素和列像素的比例因子 扭曲factor 镜片扭曲 2° 动机 Camera Calibration 用于 重构真实世界模型:Virtual L.A. project 与世界交互 ...
A Flexible New Technique for Camera Calibration----张正友相机标定经典原文中文翻译 http://blog.csdn.net/wangxiaokun671903/article/details/ 分类: 相机标定 17:10 675人阅读 评论(0) 收藏
Camera Calibration Toolbox for Matlab 摄像头标定工具箱Matlab版本 Getting started Go to the download page, and retrieve the latest version of the complete camera calibration toolbox for Matla ... 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
基于ARToolkit+Plus的增强现实系统实现及框架研究
下载积分:1989
内容提示:基于ARToolkit+Plus的增强现实系统实现及框架研究
文档格式:PDF|
浏览次数:189|
上传日期: 10:35:09|
文档星级:
该用户还上传了这些文档
基于ARToolkit+Plus的增强现实系统实现及框架研究
官方公共微信

我要回帖

更多关于 android 获取camera 的文章

 

随机推荐