Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于Kinect和OpenGL的投影映射_C++_Opengl_Camera_Mapping_Kinect - Fatal编程技术网

C++ 基于Kinect和OpenGL的投影映射

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

我目前正在使用名为procamcalibJavaCV软件校准Kinect投影仪设置,该设置以Kinect RGB摄像头为原点。此设置仅包括一个Kinect RGB摄像头(目前我大致使用Kinect,就像普通摄像头一样)和一个投影仪。此校准软件使用LibFreenect(OpenKinect)作为Kinect驱动程序

一旦软件完成其过程,它将为我提供相机和投影仪的内部和外部参数,这些参数将被抛出到OpenGL软件中,以验证校准,并且是一些问题的开始。一旦投影和模型视图设置正确,我应该能够将Kinect看到的内容与投影内容相匹配,但为了实现这一点,我必须在所有3个轴上进行手动平移,最后一部分对我来说没有任何意义!你们能帮我整理一下吗? 用于检索Kinect数据的SDK是OpenNI(不是最新的2.x版本,应该是1.5.x)

我将确切地解释我是如何重现这个错误的。校准参数使用如下:

投影矩阵设置为(基于):

模型视图矩阵设置为:

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();