如何在Android中使用OpenGL ES的OpenCV旋转和平移向量?

Pan*_*oro 14 android opencv opengl-es augmented-reality

我正在研究Android上的基本增强现实应用程序.到目前为止我所做的是用opencv检测一个正方形然后使用cvFindExtrinsicCameraParams2()我计算了一个旋转和平移向量.为此,我使用了4个对象点,它们只是(0,0,0)方形的角和图像中方形的4个角.

这给我一个非常好的旋转和平移矩阵.我还用cvRodrigues2()计算了旋转矩阵,因为使用它比旋转矢量更容易.只要我用它们在图像中绘制一些点就可以了.然而,我的下一步是将这些向量和矩阵传递回java,然后使用它们与OpenGL在OpenGLView中绘制一个正方形.正方形应该恰好位于OpenGLView后面显示的图像中的正方形.

我的问题是我找不到在OpenGL中使用旋转矩阵和平移向量的正确方法.我开始使用与openCV函数完全相同的对象点.然后我以几乎任何可能的方式应用旋转矩阵和平移向量.遗憾的是,这些方法都没有产生任何接近我希望的结果.谁能告诉我如何正确使用它们?

到目前为止,我得到的"最接近"的结果是将整个矩阵随机乘以-1.但大多数情况下,方块仍然看起来镜像反转或旋转180度.所以我想这只是一个幸运的打击,但不是正确的方法.

Pan*_*oro 11

好的,经过一些更多的测试,我终于设法让它发挥作用.虽然我不明白......它确实"有效".对于将来需要这样做的人来说,这是我的解决方案.

float rv[3]; // the rotation vector
float rotMat[9]; // rotation matrix
float tv[3]; // translation vector.


rv[1]=-1.0f * rv[1]; rv[2]=-1.0f * rv[2];
//Convert the rotation vector into a matrix here.

//Complete matrix ready to use for OpenGL
float RTMat[] = {rotMat[0], rotMat[3], rotMat[6], 0.0f,
                 rotMat[1], rotMat[4], rotMat[7], 0.0f,
                 rotMat[2], rotMat[5], rotMat[8], 0.0f,
                 tv[0], -tv[1], -tv[2], 1.0f};
Run Code Online (Sandbox Code Playgroud)

正如genpfault在他的评论中所说,自从OpenGL需要一个列主要订单以来,所有东西都需要转换.(感谢评论,我之前已经看过那个页面.)此外,y和z旋转角度以及y和z平移需要乘以-1.这是我觉得有点奇怪.为什么只有那些而不是x值呢?

这应该是我应该猜测的.但角落不完全匹配.我想这是由一些错误的openGLView配置引起的.所以即使我仍然不满意我的解决方案,我想这是我的问题的答案.

  • 你需要翻转y和z,因为在-z轴下打开GL视图并在左下角定义它的原点,openCV的原点在左上角,z很可能是正数. (5认同)