假设您有一台相机并拍摄一张躺在桌子上的矩形纸的快照。 我们得到那张照片,用作平面背景,并且需要设置一个OpenGL场景,就像它用带坐标的四边形渲染一样,假设(0,0,0)(1,0,0)(1) ,2,0)(0,2,0)具有特定的相机和视图设置。
换句话说,我们需要在photoshop的“消失点”功能背后重现相同的算法。
问题的数学解决方案需要确定一些更常数被定义为给出一个解(观察者的距离等)。在构建时修复这些数据应该没有问题。
数学解决方案将受到赞赏,但更好的是一个有效的C / C ++代码,参考任何外部数学框架的几何变换等等,输入相干数据到OpenGL相机模型参数。
NyArToolkit和OpenCV都具有有趣且复杂的功能,但输入指的是不需要的“训练”。 Photoshop的“消失点”功能实时工作,输入结果只有4个2d点。
我们需要的功能就像
BOOL calculate_3D_scene_From_2D_Rectangle(
point2d* pointsList, // in: array of the four corners of the quad rectangle
// in 2d coordinates, in clockwise order
rect2d sceneSize, // in: view area in 2d coordinates, points are contained
// within this area
float eyeDistance // in: distance from observer eye to the object
point3d* vertexList // out: four coordinates of the point in 3d space
float* mvMatrix // out: 4x4 matrix to use as model view matrix in openGl
// return: true if found a correct result
);
示例明显用法
point2d pointsList[] = { { -5, -5 }, { 10, -5 }, { 10, 10 }, { -5, 10 } };
rect2d sceneSize = { -20,-20,20,20 };
float eyeDistance = 20;
point3d vertexList[4];
float mvMatrix[16];
calculate_3D_scene_From_2D_Rectangle(
pointsList,sceneSize,eyeDistance,vertexList,mvMatrix);
[...]
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLoadMatrixf(mvMatrix);
[...]
draw the polygon with vertexList[0..3];
[...]
对于正确的calculate_3D_scene_From_2D_Rectangle()的任何真正适用的实现将不胜感激。
答案 0 :(得分:1)
这听起来像是相机校准,是计算机视觉中的常见任务。 OpenCV为此提供了以下功能:
答案 1 :(得分:0)
看一下findhomography。这可能已经足够你的任务了。如果你想进行全相机校准,你需要超过4个点(最小值为6),但对于平面映射,单应性方法可以正常工作。