2014-11-04 88 views
0

我正在试验kinect,但是我在缩放时遇到了一些问题。下面是来自kinect-kcb的代码,虽然面部跟踪适用于“网格”,但我在为自己的类返回缩放值时遇到问题。下面的代码返回一个正确的旋转和平移,它的功能是完美的,但是这个尺度只能在很长一段时间内返回1(尽管网格尺寸明显变化),然后慢慢变小0.98 ...等,但显然不是正确的缩放值。Kinect在C++中的缩放

float scale; 
float rotation[ 3 ]; 
float translation[ 3 ]; 
hr = mResult->Get3DPose(&scale, rotation, translation); 
if (SUCCEEDED(hr)) { 
    Vec3f r(rotation[ 0 ], rotation[ 1 ], rotation[ 2 ]); 
    Vec3f t(translation[ 0 ], translation[ 1 ], translation[ 2 ]); 

    face.mPoseMatrix.translate(t); 
    face.mPoseMatrix.rotate(r); 
    face.mPoseMatrix.translate(-t); 
    face.mPoseMatrix.translate(t); 
    face.mPoseMatrix.scale(Vec3f::one() * scale); 
} 

此比例值被重复使用thoughout的代码,但似乎没有足够经常改变(例如功能 - 不按顺序):

hr = mModel->Get3DShape(shapeUnits, numShapeUnits, animationUnits, numAnimationUnits, scale, rotation, translation, pts, numVertices); 

hr = mModel->GetProjectedShape(&mConfigColor, mSensorData.ZoomFactor, viewOffset, shapeUnits, numShapeUnits, animationUnits, 
          numAnimationUnits, scale, rotation, translation, pts, numVertices); 

Kinect的具有功能FaceModel.Scale( ),但是这只会返回一个常数值,我假设它是3D模型的初始缩放值,然后我假设上面的缩放值会随着用户离摄影机越来越近而改变。

+0

所以即时猜测你的目标是使用比例值来尝试和判断距相机的距离? – ldgorman 2014-11-05 11:58:18

+0

我最终发现了三维模型的z值(希望有一个更好的方法)。谢谢你的帮助 :)。 – user1546650 2014-11-05 14:41:07

回答

1

方法IFTResult::Get3DPose除了别的以外,给你的脸比例尺值。如果它等于1.0,那么脸部比例等于加载的3D模型(所以不需要做什么?)。

如果重新加载3d模型时,面值不等于1.0,那么您需要在模型上进行工作。

你试过输出一些关于IFTResult :: Get3DPose分配给pScale的调试信息吗?

它也有可能是系统未能跟踪,你可以用IFTResult::GetStatus来检查。

这可能是你所追求的是face rectangle的大小。这将随着图像主体的接近而缩放。

Heres相关代码项目链接。

+0

嗨,谢谢你的回应。这就是我一直在做的事情。我必须小心理解,但即使模型正在改变大小,然后跳转到0.984683一段时间,即使模型继续快速改变大小等,pScale输出1.0也是如此。它似乎没有像预期的那样行为?我的调试看起来像pScale = 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,9.8 ...,9.8,...,9.8 ... ,9.8尽管经常移动的用户。 – user1546650 2014-11-04 16:29:54

+0

是否有可能您对面部矩形的大小感兴趣,我认为我们一直在讨论的比例值与3D几何有关 – ldgorman 2014-11-04 16:34:05

+0

我很担心这一点。我想我知道你的意思。我认为最好的方法就是手动计算它。感谢您的帮助:)。 – user1546650 2014-11-04 16:57:37