iPhone后置摄像头无法正确对焦
iPhone back camera cannot focus correctly
我一直在制作一个 iOS 相机应用程序并试图解决这个问题两天(但无法解决)。
我现在正在做的是根据用户点击的位置自动更改焦点和曝光。有时它工作正常(总共可能大约 20%),但大多数情况下它会失败。尤其是当我尝试聚焦在远处的物体(如 5 米以上)或有两个物体并尝试将一个物体的焦点切换到另一个物体时。下图就是一个例子。
黄色方块位于用户点击的位置,即使我在第一张图片中点击了黑色杯子,相机仍然聚焦在红色杯子上。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touchPoint = touches.first! as UITouch
let focusPoint = touchPoint.location(in: lfView)
print("focusPoint \(focusPoint)")
showPointOfInterestViewAtPoint(point: focusPoint)
setFocus(focusMode: .autoFocus, exposureMode: .autoExpose, atPoint: focusPoint, shouldMonitorSujectAreaChange: true)
}
func setFocus(focusMode: AVCaptureDevice.FocusMode, exposureMode: AVCaptureDevice.ExposureMode, atPoint devicePoint: CGPoint, shouldMonitorSujectAreaChange: Bool) {
guard let captureDevice = captureDevice else { return }
do {
try captureDevice.lockForConfiguration()
} catch let error as NSError { return }
if captureDevice.isFocusPointOfInterestSupported, captureDevice.isFocusModeSupported(focusMode) {
captureDevice.focusPointOfInterest = devicePoint
captureDevice.focusMode = focusMode
print("devicePoint: \(devicePoint)")
}
// other codes in here...
captureDevice.isSubjectAreaChangeMonitoringEnabled = shouldMonitorSujectAreaChange
captureDevice.unlockForConfiguration()
}
我在 touchesBegan 函数中调用了 setFocus 函数,focusPoint 和 devicePoint 注释显示相同的坐标,例如 (297.5, 88.0)。
当我点击图片中的黑色杯子时,我可以看到 iPhone 相机正在一点点放大和缩小,就像我使用默认的 iPhone 相机应用程序和尝试专注于一个对象。所以我想我的相机应用程序正试图聚焦在黑色杯子上,但它失败了。
由于这不是错误,我不确定要更改哪个代码。是否知道这里发生了什么以及导致此问题的原因?
稍后添加此部分
我也看了this document,它说
This property’s CGPoint value uses a coordinate system where {0,0} is the top-left of the picture area and {1,1} is the bottom-right.
我之前写过,devicePoint
的值给了我不止1,比如297.5,88.0。这会导致问题吗?
感谢@Artem,我得以解决问题。我需要做的就是将绝对坐标转换为 focusPointOfInterest 中使用的值(最小(0,0)到最大(1,1))。
谢谢你,阿尔乔姆!!
我一直在制作一个 iOS 相机应用程序并试图解决这个问题两天(但无法解决)。
我现在正在做的是根据用户点击的位置自动更改焦点和曝光。有时它工作正常(总共可能大约 20%),但大多数情况下它会失败。尤其是当我尝试聚焦在远处的物体(如 5 米以上)或有两个物体并尝试将一个物体的焦点切换到另一个物体时。下图就是一个例子。
黄色方块位于用户点击的位置,即使我在第一张图片中点击了黑色杯子,相机仍然聚焦在红色杯子上。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touchPoint = touches.first! as UITouch
let focusPoint = touchPoint.location(in: lfView)
print("focusPoint \(focusPoint)")
showPointOfInterestViewAtPoint(point: focusPoint)
setFocus(focusMode: .autoFocus, exposureMode: .autoExpose, atPoint: focusPoint, shouldMonitorSujectAreaChange: true)
}
func setFocus(focusMode: AVCaptureDevice.FocusMode, exposureMode: AVCaptureDevice.ExposureMode, atPoint devicePoint: CGPoint, shouldMonitorSujectAreaChange: Bool) {
guard let captureDevice = captureDevice else { return }
do {
try captureDevice.lockForConfiguration()
} catch let error as NSError { return }
if captureDevice.isFocusPointOfInterestSupported, captureDevice.isFocusModeSupported(focusMode) {
captureDevice.focusPointOfInterest = devicePoint
captureDevice.focusMode = focusMode
print("devicePoint: \(devicePoint)")
}
// other codes in here...
captureDevice.isSubjectAreaChangeMonitoringEnabled = shouldMonitorSujectAreaChange
captureDevice.unlockForConfiguration()
}
我在 touchesBegan 函数中调用了 setFocus 函数,focusPoint 和 devicePoint 注释显示相同的坐标,例如 (297.5, 88.0)。
当我点击图片中的黑色杯子时,我可以看到 iPhone 相机正在一点点放大和缩小,就像我使用默认的 iPhone 相机应用程序和尝试专注于一个对象。所以我想我的相机应用程序正试图聚焦在黑色杯子上,但它失败了。
由于这不是错误,我不确定要更改哪个代码。是否知道这里发生了什么以及导致此问题的原因?
稍后添加此部分
我也看了this document,它说
This property’s CGPoint value uses a coordinate system where {0,0} is the top-left of the picture area and {1,1} is the bottom-right.
我之前写过,devicePoint
的值给了我不止1,比如297.5,88.0。这会导致问题吗?
感谢@Artem,我得以解决问题。我需要做的就是将绝对坐标转换为 focusPointOfInterest 中使用的值(最小(0,0)到最大(1,1))。
谢谢你,阿尔乔姆!!