我正在开发的增强现实的iPhone应用程序。
它应该基本上做是分配到地理位置当你看他们通过摄像头显示图片。 每个这样的图像可以被理解为具有其地理位置和航向(理解为它的平面与正北方向轴之间的角度)广告牌。
我们的目标是让这些广告牌显示更多或更少就像它们是物理对象。 如果你接近他们越来越远的时候小,他们应该会更大。 他们应该也出现在适当的角度,当你不在他们面前直接站。
我想我已经实现了这个目标或多或少。 通过从iPhone的初始航向测量到图像I可以决定对作为由照相机观察到的图像的旋转角(看他们在一个适当的角度)。
但是,如果涉及到基于从手机的距离缩放他们,我想我拧我的做法。 我做了一个假设,即最大视图distanse是,比方说200米。 然后广告牌为100米的电话将显示在其原始大小的50%。 而已。 基于所述最大距离的线性缩放。
我错过了这个做法是广告牌的尺寸(理解为物理对象)。 他们在屏幕上显示的方式取决于他们只在像素尺寸。 这意味着,显示器的分辨率是决定你如何看待他们的一个因素。 所以,我认为如果你得到两个手机具有相同的屏幕尺寸,但不同的分辨率,相同的图片将是他们两个大小不同的。 我对吗?
于是最后,我的问题是如何处理缩放图片,使它们看起来好上了AR看法?
我想我应该采取一些相机参数考虑进去。 当10×10厘米的对象仅仅是在照相机的前面它可覆盖整个屏幕。 但是当你把它更远几米,就变成一个小细节。 那么如何处理缩放? 如果我决定物理尺寸分配给我的虚拟广告牌,然后根据从相机的距离如何扩大呢?
我说得对,我应该在分配物理米尺寸每张照片(不管他们在像素尺寸),并根据尺寸和一些相机相关的比例因子显示它们?
你能帮我一下吗? 任何线索将是有益的。 谢谢!
我认为我设法解决我的问题。 让我来解释我是如何做到的因为如果可能使用他人的。 如果你觉得这种做法不对,我将成为您的意见或任何进一步的线索表示感谢。
我决定在米物理尺寸分配给我的虚拟广告牌。 这个讨论帮我找到了iPhone 4的摄像头参数: 焦距和CCD sesnor的尺寸 。 更重要的是,这些数值还帮我计算合适的FOV为我的AR应用程序(见计算视摄像头的角度 )。
这个网站帮我计算在CCD传感器产生的物理对象图像的毫米大小。 所以,如果我的广告牌具有宽度和高度在米,从摄像机的距离是已知的,以及摄像机的焦距,我可以在传感器上计算它们的大小。
(焦距*的对象尺寸)/镜头到对象的距离=图像尺寸(在传感器上)
double CalculatePhysicalObjectImageDimensionOnCCD(double cameraFocalLength_mm, double physicalObjectDimension_m, double distanceFromPhysicalObject_m)
{
double physicalObjectDimension_mm = physicalObjectDimension_m * 1000;
double distanceFromPhysicalObject_mm = distanceFromPhysicalObject_m * 1000;
return (cameraFocalLength_mm * physicalObjectDimension_mm) / distanceFromPhysicalObject_mm;
}
我对这个问题所知甚少,所以我不知道如果当时我采取的方法是确定的,但我决定来计算iPhone的屏幕是如何大得多相比CCD传感器的尺寸。 因此,通过一个简单的数学运算,我得到一个传感器到屏幕的大小比例。 由于传感器和屏幕的宽度与高度的比率似乎是不同的,我计算在一种方式暴躁的比率
double GetCCDToScreenSizeRatio(double sensorWidth, double sensorHeight, double screenWidth, double screenHeight)
{
return sqrt(screenWidth * screenHeight) / sqrt(sensorWidth * sensorHeight);
}
然后我得到的比可以被视为乘数。 第一计算我在传感器上的虚拟广告牌的尺寸,然后通过比率相乘。 这样,我得到了像素的广告牌的实际大小。 而已。 所以,当我从它提供我的广告牌的宽度和距离可以拨打下面只是功能,在屏幕上看到返回的广告牌的像素宽度。 同为广告牌的高度,以获得两个维度。
const double CCD_DIM_LONGER_IPHONE4 = 4.592; //mm
const double CCD_DIM_SHORTER_IPHONE4 = 3.450; //mm
const double FOCAL_LENGTH_IPHONE4 = 4.28; //mm
double CalculatePhysicalObjectImageDimensionOnScreen_iPhone4(double physicalObjectDimension_m, double distanceFromPhysicalObject_m)
{
double screenWidth = [UIScreen mainScreen].bounds.size.width;
double screenHeight = [UIScreen mainScreen].bounds.size.height;
return CalculatePhysicalObjectImageDimensionOnScreen(FOCAL_LENGTH_IPHONE4, physicalObjectDimension_m, distanceFromPhysicalObject_m, CCD_DIM_LONGER_IPHONE4, CCD_DIM_SHORTER_IPHONE4, screenWidth, screenHeight);
}
double CalculatePhysicalObjectImageDimensionOnScreen(double cameraFocalLength_mm, double physicalObjectDimension_m, double distanceFromPhysicalObject_m, double ccdSensorWidth, double ccdSensorHeight, double screenWidth, double screenHeight)
{
double ccdToScreenSizeRatio = GetCCDToScreenSizeRatio(ccdSensorWidth, ccdSensorHeight, screenWidth, screenHeight);
double dimensionOnCcd = CalculatePhysicalObjectImageDimensionOnCCD(cameraFocalLength_mm, physicalObjectDimension_m, distanceFromPhysicalObject_m);
return dimensionOnCcd * ccdToScreenSizeRatio;
}
看来,它完美的作品相比,TY我以前的,线性缩放的愚蠢做法。 我也注意到,顺便说一句,这是真正重要的是知道的FOV为您的相机在AR视图注册虚拟对象时。 下面是如何根据CCD传感器的尺寸和焦距计算FOV。
它是如此困难的地方找到这些值! 我不知道为什么他们不能访问程序(至少我的研究表明我说,他们都没有)。 看来,有必要准备硬编码值,然后检查应用程序运行在决定哪个值做上述所有的计算时,选择设备的型号: - /。