Моя проблема проста, но мне тяжело с реальным кодом. Я использую камеру (ARCamera от ARKit), которая выводит видео на экран. Камера iPhone широкая (пространство для камеры), тогда как на экране отображается только ее часть (пространство на экране).
Каркас Vision дает мне CGRect (boundingBox), который относится к датчику камеры. Например, он может сказать мне, что лицо было обнаружено в датчике камеры в точке (x: 1, y: 1, ширина: foo, высота: полоса).
Проблема в том, что начало координат (1, 1) находится в левой части пространства камеры, но не должно быть видно в пространстве экрана.
Я думаю, что хочу масштабировать преобразование, а затем преобразовать преобразование CGRect из кадра камеры в кадр экрана.
private func transformBoundingBox(bound: CGRect) -> CGRect {
// iPhone camera res is 1920 x 1440
// iPhone screen pts is 375 x 812
let xFactor = CGFloat(self.cameraResolution.width/self.cameraResolution.height) // 1.333
let scaledWidth = view.frame.width*xFactor // 500
// this part works, converting the Vision CGRect to a CGRect
// that is too wide for the current screen, but is properly oriented
let visionTransform = CGAffineTransform(scaleX: 1, y: -1).translatedBy(x: 0, y: -view.frame.height)
let screenScale = CGAffineTransform.identity.scaledBy(x: scaledWidth, y: view.frame.height)
let screenBound = bound.applying(screenScale).applying(visionTransform)
// this part is broken, the translate transform
// (intended to adjust the X origin so that what is not visible is off screen)
// this code seems to perform "OK" on the left half of the screen
let widthAdjustment = -(scaledWidth - view.frame.width) * xFactor * (1/2)
let cameraTranslate = CGAffineTransform(scaleX: 1, y: 1).translatedBy(x: widthAdjustment, y: 0)
let updatedBound = screenBound.applying(cameraTranslate)
return updatedBound
}
Я пробовал код ВЫШЕ (и много вариантов), но он не работает. Это особенно проблемы с правой стороны.
Для справки, код НИЖЕ работает, чтобы переориентировать и подогнать рамку камеры к рамке экрана. Но это неверно, поскольку элементы, находящиеся за пределами экранного пространства, сопоставляются с экранным пространством.
let transform = CGAffineTransform(scaleX: 1, y: -1).translatedBy(x: 0, y: -view.frame.height)
let translate = CGAffineTransform.identity.scaledBy(x: view.frame.width, y: view.frame.height)
let transformedBound = bound.applying(translate).applying(transform)
Как правильно преобразовать CGRect, который слишком велик для экрана iPhone, чтобы стороны / края (в данном случае слева и справа) были обрезаны?