TextRecognization
unknown
objectivec
8 months ago
4.7 kB
5
Indexable
#import "CameraViewForSerialNumberDetection.h"
@interface CameraViewForSerialNumberDetection ()
@property (nonatomic, assign) BOOL isProcessingFrame;
@property (nonatomic, strong) dispatch_queue_t visionQueue;
@end
@implementation CameraViewForSerialNumberDetection
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor];
self.isProcessingFrame = NO;
self.visionQueue = dispatch_queue_create("com.example.VisionQueue", DISPATCH_QUEUE_SERIAL);
[self setupCamera];
[self setupCloseButton];
}
// Setup the camera preview
- (void)setupCamera {
self.session = [[AVCaptureSession alloc] init];
self.session.sessionPreset = AVCaptureSessionPresetHigh;
AVCaptureDevice *camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:camera error:&error];
if (error) {
NSLog(@"Error setting up camera: %@", error.localizedDescription);
return;
}
[self.session addInput:input];
AVCaptureVideoDataOutput *videoOutput = [[AVCaptureVideoDataOutput alloc] init];
[videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
[self.session addOutput:videoOutput];
self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
self.previewLayer.frame = self.view.bounds;
[self.view.layer addSublayer:self.previewLayer];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
[self.session startRunning];
});
}
// Delegate method: Processes each frame from the live camera feed
- (void)captureOutput:(AVCaptureOutput *)output
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
[self recognizeTextFromImage: imageBuffer];
}
-(void) recognizeTextFromImage:(CVImageBufferRef )imageBuffer {
VNImageRequestHandler *handler = [[VNImageRequestHandler alloc] initWithCVPixelBuffer:imageBuffer options:@{}];
VNRecognizeTextRequest *textRequest = [[VNRecognizeTextRequest alloc] initWithCompletionHandler:^(VNRequest *request, NSError *error) {
if (error) {
NSLog(@"Text recognition error: %@", error.localizedDescription);
return;
}
for (VNRecognizedTextObservation *observation in request.results) {
VNRecognizedText *topCandidate = [[observation topCandidates:1] firstObject];
if (topCandidate) {
NSString *recognizedText = topCandidate.string;
if ([self isValidSerial:recognizedText]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self dismissViewControllerAnimated:YES completion:^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationForScannedSerialNumber" object:recognizedText];
}];
});
}
}
}
}];
textRequest.recognitionLevel = VNRequestTextRecognitionLevelAccurate;
NSError *error = nil;
[handler performRequests:@[textRequest] error:&error];
if (error) {
NSLog(@"Error performing text recognition: %@", error.localizedDescription);
}
}
- (void)setupCloseButton {
UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeSystem];
UIImage *closeImage = [UIImage systemImageNamed:@"xmark"];
[closeButton setImage:closeImage forState:UIControlStateNormal];
CGFloat buttonSize = 40;
closeButton.frame = CGRectMake(self.previewLayer.frame.size.width - 60, 50, buttonSize, buttonSize);
closeButton.tintColor = [UIColor whiteColor];
closeButton.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
closeButton.layer.cornerRadius = buttonSize / 2;
closeButton.clipsToBounds = YES;
closeButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);
[closeButton addTarget:self action:@selector(closeScanner) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:closeButton];
}
- (void)closeScanner {
[self dismissViewControllerAnimated:YES completion:nil];
}
- (BOOL)isValidSerial:(NSString *)serialNumberStr {
if ([serialNumberStr length] > 0) {
String sn = StringFromNSString(serialNumberStr);
sn.trim();
try {
SerialNumber serial(sn);
return serial.isValid();
} catch (...) {}
}
return NO;
}
@end
Editor is loading...
Leave a Comment