【发布时间】:2021-03-10 07:29:06
【问题描述】:
更新:问题似乎归结为未校正相机的固有矩阵,但这些矩阵不可用。请参阅下面的编辑 3。
我正在使用AVCaptureMultiCamSession、builtInDualCamera、两个输出和一个AVCaptureDataOutputSynchronizer 捕捉视频,用于计算机视觉。我正在裁剪广角相机图像,以便视野匹配。视频是以相机的自然方向拍摄的,即右侧的“主页按钮”。
由于广角和长焦设备仅沿相机水平轴物理位移,至少在 iPhone 12 Pro 上,我预计仅沿水平图像轴的深度差异。除了一个奇怪的问题之外,这基本上是成立的:
当且仅当我将设备大致竖直放置在横向时,图像之间会有轻微的垂直差异,对应于 1920x1080 的广角帧中大约 11 个像素。但是,如果我将设备竖直放置在纵向,或者将其平放(与地面平行),图像空间的垂直差异就会消失。这是一个渐进的过渡,所以我越接近直立和横向,我得到的图像空间垂直差异就越大。
由于问题肯定取决于物理设备的方向,似乎必须以某种方式涉及陀螺仪。编辑:它也可以是加速度计或OIS。是否有任何 AVFoundation 设置可以使其在视频捕获期间使用陀螺仪、加速度计或 OIS?我唯一能想到的就是视频稳定功能,但肯定是关掉了。
以下是一些说明该问题的屏幕截图。屏幕截图都是相机的自然方向,即右侧的“主页按钮”。它们被裁剪。蓝色圆圈来自广角镜头,红色圆圈来自长焦镜头。
编辑:第一张照片是在设备直立的情况下拍摄的,“主页按钮”在右侧。 左边的“主页按钮”,从用户的角度来看,垂直差异是相同的,即它相对于视频帧是倒置的。
编辑 2:对于设备类型 builtInWideAngleCamera 和 builtInTelephotoCamera,通过调用 ports(for:sourceDeviceType:sourceDevicePosition:) 获取输入端口。虚拟设备builtInDualCamera 也有一个不同的复合输入端口,它可以根据当前的缩放级别从任一摄像机中抓取帧。奇怪的是,后一个端口似乎产生了与builtInWideAngleCamera 端口相同的帧。换句话说,builtInWideAngleCamera 端口根据缩放级别从两个物理设备中的任何一个输出帧。这似乎是一个错误。
编辑 3:从 36:28 开始,this WWDC talk 强烈暗示您需要纠正组成设备的内在矩阵,以便将图像相互关联。这大概就是问题所在。不幸的是,isCameraIntrinsicMatrixDeliverySupported 为我的两个连接返回了false,即使我的捕获会话的设置与演讲中描述的完全一样。
【问题讨论】:
-
你有没有检查相机之间的extrinsic matrix,旋转设备时它是否改变?
-
好问题@FrankSchlegel。当我移动相机时,外在矩阵不会改变。它是:
simd_float4x3([[0.9999969, -0.0001923358, -0.0024844604], [0.0001978918, 0.9999975, 0.0022362475], [0.002484024, -0.0022367323, 0.9999944], [-15.419649, 0.0027622615, 0.12930928]]),即几乎没有旋转,几乎只有水平平移。 -
您是否在文档中看到了有关视频稳定的说明?也许这会影响对齐方式。
-
@FrankSchlegel 视频稳定功能默认是关闭的,我也验证它是关闭的。您指的是文档中的哪个注释?
-
来自extrinsicMatrix(from:to:),底部的“重要”部分。
标签: ios camera computer-vision avfoundation