故事:
我有一个应用程序,正在检测面部构建与iphone sdk 6.0上的opencv每件事情都在工作我可以使用前置摄像头和“后置摄像头”我也可以打开/关闭手电筒我也可以显示多少我现在的fps(现场)。
但是现在我想添加一个额外的功能,你可以看到这张脸的票价是多少
是否有一些公式或一些好的想法或者从专业人士那里获得解决方案? (如果您需要一些代码或某些东西,我可以向您展示您需要的所有东西)
寻求帮助和快速解答!^^
听取每个人的目标c翻译
-(double) faceDistance{
const NSInteger kFaceWidth = 10;
const NSInteger kPicWidth = 640;
CGPoint p1 = CGPointMake(10, 10);
CGPoint p2 = CGPointMake(100, 70);
int facePixelWidth;
int slope = (p2.y - p1.y) / (p2.x - p1.x);
double propOfPic = kPicWidth / facePixelWidth;
double surfSize = propOfPic * kFaceWidth;
double dist = surfSize / slope;
return dist;
}
我在这里更新我的代码是目标c的解决方案
答案 0 :(得分:5)
我在图像处理/ AR方面做了一些工作,但当然不会认为自己是专家。那就说让我们继续讨论如何处理这个问题:
如果你想知道脸部有多远,你可以根据脸部的平均大小来估计它。我的意思是人脸的大小都非常相似(它们在任何方向上的偏差都不会超过几厘米)。因此,如果您进行一些测试,您可以计算出面在多个距离处的像素数,并使用trig来近似其他距离。显然你无法通过这种方法计算出非常精确的距离,但是你可以区分距离半米远的人和距离3米远的人。
您需要知道您正在使用的相机的分辨率,并且可能会对每种可能的分辨率进行一些测试。
<强>更新强>:
好的,所以我被要求详细说明一下。图片中看到的空间量与表面离相机的距离呈线性关系。
假设人脸宽10厘米
好吧,让我们将相机指向一个直角的米尺。将相机保持在10厘米远的地方。这看多少钱?让我们说它看到了10厘米的米棒。
现在将相机移动到1米远。让我们说它现在看到70厘米。使用此信息,我们可以生成以下Java:
public static final int FACE_WIDTH = 10;
public static final int PIC_WIDTH = 640; // In pixels
Point p1 = new Point(10,10);
Point p2 = new Point(100,70);
int slope = (p2.y-p1.y)/(p2.x-p1.x);
public static double faceDistance(int facePixelWidth)
{
double propOfPic = PIC_WIDTH / facePixelWidth;
double surfSize = propOfPic * FACE_WIDTH;
double dist = surfSize / slope;
return dist;
}
此应该有效。我没有测试过它,但从数学上看似乎是正确的。