Skip to content

Instantly share code, notes, and snippets.

View onmyway133's full-sized avatar
๐Ÿ˜‡
What you don't know is what you haven't learned

Khoa onmyway133

๐Ÿ˜‡
What you don't know is what you haven't learned
View GitHub Profile
let rect = cameraLayer.layerRectConverted(fromMetadataOutputRect: result.boundingBox)
layer.frame = rect
let layer = CALayer()
view.layer.addSublayer(layer)
layer.borderWidth = 2
layer.borderColor = UIColor.green.cgColor
// 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
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)
}
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
}
}
func handle(buffer: CMSampleBuffer) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(buffer) else {
return
}
let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
guard let image = ciImage.toUIImage() else {
return
}
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()
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())
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
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> {