AVAsset — CIDetectorImageOrientation

Я хочу запустить распознавание лиц с помощью CoreImage на каждом кадре В AVAssetи для этого, мне нужно CIDetectorImageOrientationдля каждого образца буфера в этом ресурсе.

Проблема в том, если я преобразую a CMSampleBufferв a UIImageи переведу это изображение в ориентацию exif с помощью:

var exifOrientation: UInt32 {
    switch self.imageOrientation {
    case .Up: return 1
    case .Down: return 3
    case .Left: return 8
    case .Right: return 6
    case .UpMirrored: return 2
    case .DownMirrored: return 4
    case .LeftMirrored: return 5
    case .RightMirrored: return 7
    }
}

ориентация всегда.Up, независимо от того, как было снято видео (передняя камера против задней) или ориентация, в которой было снято видео.

Как я могу правильно получить CIDetectorImageOrientationдля a CMSampleBuffer?

1 ответ

  1. Вам нужно получить ориентацию видеодорожки этого актива. Эта ориентация будет одинаковой для каждого кадра.
    Вот примерно, как вы это сделаете в Objective C.

    AVAssetTrack *videoTrack =[asset tracksWithMediaType:AVMediaTypeVideo].firstObject;
    CGSize size = [videoTrack naturalSize];
    CGAffineTransform preferredTransform = [videoTrack preferredTransform];
    
    if (size.width == preferredTransform.tx && size.height == preferredTransform.ty) {
      return kCGImagePropertyOrientationRight;
    } else if (preferredTransform.tx == 0 && preferredTransform.ty == 0) {
      return kCGImagePropertyOrientationUpLeft;
    } else if (preferredTransform.tx == 0 && preferredTransform.ty == size.width) {
      return kCGImagePropertyOrientationDown;
    }
    ...