๐
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let rect = cameraLayer.layerRectConverted(fromMetadataOutputRect: result.boundingBox) | |
layer.frame = rect |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let layer = CALayer() | |
view.layer.addSublayer(layer) | |
layer.borderWidth = 2 | |
layer.borderColor = UIColor.green.cgColor |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Convert UIImageOrientation to CGImageOrientation for use in Vision analysis. | |
extension CGImagePropertyOrientation { | |
init(_ uiImageOrientation: UIImage.Orientation) { | |
switch uiImageOrientation { | |
case .up: self = .up | |
case .down: self = .down | |
case .left: self = .left | |
case .right: self = .right | |
case .upMirrored: self = .upMirrored | |
case .downMirrored: self = .downMirrored |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let handler = VNImageRequestHandler( | |
cgImage: cgImage, | |
orientation: inferOrientation(image: image), | |
options: [VNImageOption: Any]() | |
) | |
let request = VNDetectTextRectanglesRequest(completionHandler: { [weak self] request, error in | |
DispatchQueue.main.async { | |
self?.handle(image: image, request: request, error: error) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension CIImage { | |
func toUIImage() -> UIImage? { | |
let context: CIContext = CIContext.init(options: nil) | |
if let cgImage: CGImage = context.createCGImage(self, from: self.extent) { | |
return UIImage(cgImage: cgImage) | |
} else { | |
return nil | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func handle(buffer: CMSampleBuffer) { | |
guard let pixelBuffer = CMSampleBufferGetImageBuffer(buffer) else { | |
return | |
} | |
let ciImage = CIImage(cvPixelBuffer: pixelBuffer) | |
guard let image = ciImage.toUIImage() else { | |
return | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
cameraLayer.videoGravity = .resizeAspectFill | |
view.layer.addSublayer(cameraLayer) | |
// register to receive buffers from the camera | |
let videoOutput = AVCaptureVideoDataOutput() | |
videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "MyQueue")) | |
self.captureSession.addOutput(videoOutput) | |
// begin the session | |
self.captureSession.startRunning() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let floatStorage = storage.transform(transformer: TransformerFactory.forCodable(ofType: [Float].self)) | |
let userStorage = floatStorage.transform(transformer: TransformerFactory.forCodable(ofType: User.self)) | |
let imageStorage = imageStorage.transform(transformer: TransformerFactory.forImage()) | |
let dataStorage = imageStorage.transform(transformer: TransformerFactory.forData()) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public extension DiskStorage { | |
func transform<U>(transformer: Transformer<U>) -> DiskStorage<U> { | |
let storage = DiskStorage<U>( | |
config: config, | |
fileManager: fileManager, | |
path: path, | |
transformer: transformer | |
) | |
return storage |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class TransformerFactory { | |
public static func forData() -> Transformer<Data> { | |
let toData: (Data) throws -> Data = { $0 } | |
let fromData: (Data) throws -> Data = { $0 } | |
return Transformer<Data>(toData: toData, fromData: fromData) | |
} | |
public static func forImage() -> Transformer<Image> { |