Проблема ориентации ios Vision VNImageRequestHandler

Я пытаюсь определить лица с помощью камеры, используя VNImageRequestHandler (iOS Vision). Когда я указываю на фотографию камерой в ландшафтном режиме, она обнаруживает лица, но в режиме противоположной ориентации.

  let detectFaceRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])

3 ответа

Вы пытались играть с VNImageRequestHandlerorientation имущество?

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

Другие вопросы по тегам