C++ 基于Kinect和OpenGL的投影映射
我目前正在使用名为procamcalib的JavaCV软件校准Kinect投影仪设置,该设置以Kinect RGB摄像头为原点。此设置仅包括一个Kinect RGB摄像头(目前我大致使用Kinect,就像普通摄像头一样)和一个投影仪。此校准软件使用LibFreenect(OpenKinect)作为Kinect驱动程序 一旦软件完成其过程,它将为我提供相机和投影仪的内部和外部参数,这些参数将被抛出到OpenGL软件中,以验证校准,并且是一些问题的开始。一旦投影和模型视图设置正确,我应该能够将Kinect看到的内容与投影内容相匹配,但为了实现这一点,我必须在所有3个轴上进行手动平移,最后一部分对我来说没有任何意义!你们能帮我整理一下吗? 用于检索Kinect数据的SDK是OpenNI(不是最新的2.x版本,应该是1.5.x) 我将确切地解释我是如何重现这个错误的。校准参数使用如下: 投影矩阵设置为(基于): 模型视图矩阵设置为:C++ 基于Kinect和OpenGL的投影映射,c++,opengl,camera,mapping,kinect,C++,Opengl,Camera,Mapping,Kinect,我目前正在使用名为procamcalib的JavaCV软件校准Kinect投影仪设置,该设置以Kinect RGB摄像头为原点。此设置仅包括一个Kinect RGB摄像头(目前我大致使用Kinect,就像普通摄像头一样)和一个投影仪。此校准软件使用LibFreenect(OpenKinect)作为Kinect驱动程序 一旦软件完成其过程,它将为我提供相机和投影仪的内部和外部参数,这些参数将被抛出到OpenGL软件中,以验证校准,并且是一些问题的开始。一旦投影和模型视图设置正确,我应该能够将Kin
proj_loc = new Vec3f( proj_RT[12], proj_RT[13], proj_RT[14] );
proj_fwd = new Vec3f( proj_RT[8], proj_RT[9], proj_RT[10] );
proj_up = new Vec3f( proj_RT[4], proj_RT[5], proj_RT[6] );
proj_trg = new Vec3f( proj_RT[12] + proj_RT[8],
proj_RT[13] + proj_RT[9],
proj_RT[14] + proj_RT[10] );
gluLookAt( proj_loc[0], proj_loc[1], proj_loc[2],
proj_trg[0], proj_trg[1], proj_trg[2],
proj_up[0], proj_up[1], proj_up[2] );
最后,将显示摄像头,并通过以下方式移动:
glPushMatrix();
glTranslatef(translateX, translateY, translateZ);
drawRGBCamera();
glPopMatrix();
使用键盘手动调整平移值,直到获得视觉匹配(我正在校准板上投影Kinect rgb相机看到的内容,因此我手动调整opengl相机,直到投影图案与打印图案匹配)
我的问题是,为什么我必须进行手动调整?modelview和projection设置应注意此问题。
我还想知道在切换这样的驱动程序时是否有任何问题,因为OpenKinect用于校准,OpenNI用于验证。这是在研究另一种流行的校准工具RGBDemo时想到的,RGBDemo表示,如果使用LibFreenect后端,则需要Kinect校准
那么,如果使用一个驱动程序进行校准并使用另一个驱动程序显示,校准是否会出错?
是否有人认为如果使用OpenCV而不是OpenGL来实现这一点,会更容易获得成功?
JavaCV参考:Procamcalib“短文”:
Procamcalib源代码:
RGBDemo校准参考:
如有必要,我可以上传更多内容,只需告诉我你们需要什么来帮助我:)对于Kinect校准,请查看RGBDemo的最新0.7版本和相应版本 从v0.7.0变更日志中: 自v0.6.1以来的新功能:
- 使用标记获取对象模型的新演示
- rgbd multikinect的简单校准模式
- 在rgbd multikinect中抓取速度更快
- 保存到磁盘时添加时间戳和相机序列
- 与PCL1.4各种错误修复的兼容性
Jason McKesson的《你也可以读一下》和Nicolas的《我是你链接到的文章的作者,我想我能帮上忙 问题在于如何设置modelview矩阵。调用gluLookAt()时,使用proj_RT的第三列作为摄影机的位置,但它不是摄影机的位置,而是摄影机坐标中世界原点的位置。我为我的新博客写了一篇文章,可能有助于澄清这一点。它描述了解释外部矩阵的三种不同(等效)方法,每种方法都有WebGL演示: 如果您必须使用gluLookAt,本文将向您展示如何使用,但只需调用
glLoadMatrix(proj\u RT)
就简单多了
tl;dr:用glLoadMatrix(项目)替换
gluLookAt()
。有趣的是,我没有收到这些回复的电子邮件,在看到这个答案之前,我已经读了你的博客两天了!我会尝试一下,如果我遇到更多的麻烦,我会告诉你。如果问题已经解决,请告诉我们问题是什么:似乎有很多人都有同样的问题,谢谢。
glPushMatrix();
glTranslatef(translateX, translateY, translateZ);
drawRGBCamera();
glPopMatrix();