Проблема ориентации ios Vision VNImageRequestHandler
Я пытаюсь определить лица с помощью камеры, используя VNImageRequestHandler
(iOS Vision). Когда я указываю на фотографию камерой в ландшафтном режиме, она обнаруживает лица, но в режиме противоположной ориентации.
let detectFaceRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
3 ответа
Вы пытались играть с VNImageRequestHandler
orientation
имущество?
let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .right, options: [:])
Я должен был установить его .right
во время чтения видеовхода с задней камеры в портретном режиме.
У меня всегда были перевернутые точки (ограничивающие прямоугольники) по вертикали. Я полностью исправил это с помощью вспомогательного метода:
private static func translateVisionToNormalBoundingBox(bb: CGRect, imageFullRect: CGRect) -> CGRect
{
let renormalized = VNImageRectForNormalizedRect(bb, Int(imageFullRect.width), Int(imageFullRect.height))
// Vertically translate origin !!!
// Vertically translate origin !!!
// Vertically translate origin !!!
return CGRect(
origin: CGPoint(
x: renormalized.origin.x,
y: imageFullRect.maxY - renormalized.origin.y - renormalized.size.height
),
size: renormalized.size
)
}
Для ориентации cgImage я использую это расширение StackOverflow:
extension UIImage {
var cgImagePropertyOrientation: CGImagePropertyOrientation {
switch imageOrientation
{
case .down: return .down
case .left: return .left
case .right: return .right
case .up: return .up
case .downMirrored: return .downMirrored
case .leftMirrored: return .leftMirrored
case .rightMirrored: return .rightMirrored
case .upMirrored: return .upMirrored
// TWEAK FOR NEW CASES !!!
// TWEAK FOR NEW CASES !!!
// TWEAK FOR NEW CASES !!!
@unknown default:
return .down
}
}
}
Преобразуйте изображение в CIImage и примените свойство direction, как показано ниже, и передайте его обработчику imagerequest.
let orientation = CGImagePropertyOrientation(uiImage.imageOrientation)
let imageElement = ciImage.applyingOrientation(Int32(orientation.rawValue))
// Show the image in the UI.
originalImage.image = uiImage
также проверьте https://github.com/gunapandianraj/iOS-Vision код для преобразования прямоугольника Vision в прямоугольник UIKit