How to implement tap-to-focus, tap-to-set-exposure - ios

I'm building this code for future learning and fun. It supposed to open the camera and enable the touch focus. It works in the rear-facing camera, but nothing happens when i flip it to the front camera. I have searched alot, but could not find any code fix to that problem. Could anyone please show me step by step with code how to make touch focus also work in the front camera view?
Down below is the focus function:
- (void) focus:(CGPoint) aPoint{
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if([device isFocusPointOfInterestSupported] &&
[device isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
CGRect screenRect = [[UIScreen mainScreen] bounds];
double screenWidth = screenRect.size.width;
double screenHeight = screenRect.size.height;
double focus_x = aPoint.x/screenWidth;
double focus_y = aPoint.y/screenHeight;
if([device lockForConfiguration:nil]) {
if([self.delegate respondsToSelector:#selector(scanViewController:didTapToFocusOnPoint:)]) {
[self.delegate scanViewController:self didTapToFocusOnPoint:aPoint];
}
[device setFocusPointOfInterest:CGPointMake(focus_x,focus_y)];
[device setFocusMode:AVCaptureFocusModeAutoFocus];
if ([device isExposureModeSupported:AVCaptureExposureModeAutoExpose]){
[device setExposureMode:AVCaptureExposureModeAutoExpose];
}
[device unlockForConfiguration];
}
}
}
The whole source can be found here:
https://gist.github.com/Alex04/6976945
UPDATE:
if ([device isExposurePointOfInterestSupported])
{
[device lockForConfiguration:&error];
[device setExposurePointOfInterest:aPoint];
if ([device isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure])
{
[device setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
}
[device setWhiteBalanceMode:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance];
[device unlockForConfiguration];
}

I don't think the front-facing camera supports tap-to-focus on any iPhone. You can check for support by checking the focusPointOfInterestSupported property of the AVCaptureDevice.
If you want to implement tap-for-exposure, check the device's exposurePointOfInterestSupported property. If the device supports the feature, set the exposurePointOfInterest property to use it.

Related

Disable auto focus during video recording using AVCam

I am using video recording from AVCam. Auto focus works fine before video recording is started. But it keeps on focusing after the video has started recording which is an annoying behavior. I have disabled video stabilization in AVCaptureConnection but still no use
AVCaptureConnection *connection = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo];
if ([connection isVideoStabilizationSupported]) {
if (SYSTEM_VERSION_LESS_THAN(#"8.0")) {
// For iOS 7
[connection setEnablesVideoStabilizationWhenAvailable:NO];
} else {
connection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeOff;
}
}
Please guide me how can I disable auto focus during video recording?
I have called following method from viewDidLoad to achieve required functionality
- (void)disableAutoFocus {
AVCaptureDevice *device = [[self videoDeviceInput] device];
[device lockForConfiguration:nil];
NSArray *devices = [AVCaptureDevice devices];
NSError *error;
for (AVCaptureDevice *device in devices) {
if (([device hasMediaType:AVMediaTypeVideo]) &&
([device position] == AVCaptureDevicePositionBack) ) {
[device lockForConfiguration:&error];
if ([device isFocusModeSupported:AVCaptureFocusModeLocked]) {
device.focusMode = AVCaptureFocusModeLocked;
NSLog(#"Focus locked");
}
[device unlockForConfiguration];
}
}
}

iOS Programatically flashlight is not powerful

To turn on torch and flashlight I'm using this code:
if ([device hasTorch]) {
[device lockForConfiguration:nil];
[device setTorchMode: on ? AVCaptureTorchModeOn : AVCaptureTorchModeOff];
[device setFlashMode: on ? AVCaptureFlashModeOn : AVCaptureFlashModeOff];
[device setFocusMode:AVCaptureFocusModeAutoFocus];
[device unlockForConfiguration];
}
But if you compare it with the native camera app you will see that the native flashlight is more powerful when capturing photo
Is there a way to make it powerful when capturing a photo similar to native camera flash?
you can update your code with this code:
- (void)setTorchToLevel:(float)torchLevel
{
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device hasTorch]) {
[device lockForConfiguration:nil];
if (torchLevel <= 0.0) {
[device setTorchMode:AVCaptureTorchModeOff];
}
else {
if (torchLevel >= 1.0)
torchLevel = AVCaptureMaxAvailableTorchLevel;
BOOL success = [device setTorchModeOnWithLevel:torchLevel error:nil];
}
[device unlockForConfiguration];
}
}
hope this will help you.
Try adding the following code.
[device setTorchModeOnWithLevel:AVCaptureMaxAvailableTorchLevel error:nil];

Toggle on/off flash with AVCam

I'm using Apple's AVCam source code to create a custom camera, I'm trying to toggle flash on/off but its not working. Here is my code, not sure what's wrong. I'm new to AVCam.
- (void) toggleFlash:(id)sender {
dispatch_async([self sessionQueue], ^{
AVCaptureDevice *currentVideoDevice = [[self videoDeviceInput] device];
AVCaptureDevicePosition currentPosition = [currentVideoDevice position];
if(currentPosition == AVCaptureDevicePositionUnspecified || currentPosition == AVCaptureDevicePositionBack) {
if([currentVideoDevice hasFlash]) {
[currentVideoDevice lockForConfiguration:nil];
[currentVideoDevice setFlashMode:AVCaptureFlashModeOn];
[currentVideoDevice unlockForConfiguration];
}
}
});
}
Its go through each line in code, and not logs any errors from this but still no luck.
- (void) toggleFlash {
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device hasTorch] && [device hasFlash]){
[device lockForConfiguration:nil];
[device setTorchMode:!device.torchActive];
[device setFlashMode:!device.torchActive];
[device unlockForConfiguration];
}
}
P.S. In my case, torch/flash is off initially.

App Terminated due to Memory Pressure when using ZBar reader

I'm using ZBar reader in my app for scanning QR Code. When I continuously open and close this scanner, the app terminated with message App Terminated due to Memory Pressure.
I searched over this and got an answer in which the same scenario that my app faces. ie, first time opening the scanner had a 1 second delay, second had a 2 second delay, third had a 5 second delay. and when going for fourth or fifth the app terminated.
But that answer is for UIImagePickerController. I'm using ZBar reader. Both are somewhat similar. I don't know how to modify my code to solve it.
Here is the code that I'm using,
codeReader = [ZBarReaderViewController new];
codeReader.readerDelegate=self;
codeReader.supportedOrientationsMask = ZBarOrientationMaskAll;
codeReader.showsCameraControls = NO;
codeReader.showsZBarControls=NO;
ZBarImageScanner *scanner = codeReader.scanner;
[scanner setSymbology: ZBAR_I25 config: ZBAR_CFG_ENABLE to: 0];
Class captureDeviceClass = NSClassFromString(#"AVCaptureDevice");
if (captureDeviceClass != nil) {
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device hasTorch] || [device hasFlash]){
[device lockForConfiguration:nil];
[device setTorchMode:AVCaptureTorchModeOff];
[device setFlashMode:AVCaptureFlashModeOff];
[device unlockForConfiguration];
}
}
[self.view.window.rootViewController presentViewController:codeReader animated:YES completion:nil];
codeReader.cameraOverlayView = overlayview;
How should I change it to solve the issue?
You can create a single instance of your ZBar reader and store it as a property on your app delegate or you can use the singleton approach that was suggested in the UIPickerController answer.
In your appDelegate.h
#property (strong,nonatomic) ZBarReaderViewController *zbarReaderVC;
In your appDidFinishLaunching in appDelegate.m
self.zbarReaderVC = [ZBarReaderViewController new];
self.zbarReaderVC.readerDelegate=self;
self.zbarReaderVC.supportedOrientationsMask = ZBarOrientationMaskAll;
self.zbarReaderVC.showsCameraControls = NO;
self.zbarReaderVC.showsZBarControls=NO;
ZBarImageScanner *scanner = self.zbarReaderVC.scanner;
[scanner setSymbology: ZBAR_I25 config: ZBAR_CFG_ENABLE to: 0];
Class captureDeviceClass = NSClassFromString(#"AVCaptureDevice");
if (captureDeviceClass != nil) {
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device hasTorch] || [device hasFlash]){
[device lockForConfiguration:nil];
[device setTorchMode:AVCaptureTorchModeOff];
[device setFlashMode:AVCaptureFlashModeOff];
[device unlockForConfiguration];
}
}
Then whenever you need the view
MyAppDelegate *d=[UIApplication sharedApplication].delegate;
ZBarReaderViewController codeReader=d.zbarReaderVC;
[self.view.window.rootViewController presentViewController:codeReader animated:YES completion:nil];
codeReader.cameraOverlayView = overlayview;
When you have finished with it remove it from the presenting view controller.
I haven't read through the docs of ZBar reader, but there is probably a method you need to call to start/stop it processing images even when it isn't presented. I know there is with ZXingObjC.

Camera Flash is not working

I am trying to make an extension for marmalade, which turns on and off the camera flash in iPhone. I am referring to this answer on SO about using camera flash. I've put the exact code what he has mentioned and [device setTorchMode:AVCaptureTorchModeOn]; gets called too. But the flash doesn't respond, as if nothing has happened. Is there anything I need to do, to make it work as a static library, so that I can use it in my extension?
Update:-
I am using iOS-SDK 6.1 to compile the extension and was testing on iPhone 4 (iOS version 4.3.1). But now I am testing on iPhone 5 (iOS version 6.0.0), and now the flash is turning on, but not turning off. I guess this might help.
That code you copied may have an error in it. Try the following:
-(void)turnOnFlash
{
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device hasTorch]) {
[device lockForConfiguration:nil];
[device setTorchMode:AVCaptureTorchModeOff];
[device unlockForConfiguration];
}
}
I don't know why, but the below code worked for me.
void TurnFlashOn_platform(bool turnOn) {
AVCaptureDevice* device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device hasTorch]){
[device lockForConfiguration:nil]; //you must lock before setting torch mode
[device setTorchMode:turnOn ? AVCaptureTorchModeOn : AVCaptureTorchModeOff];
[device unlockForConfiguration];
}
}
I guess must be some typos. Thanks anyways.
Use this function to turn on and off the flash light...
#import <AVFoundation/AVFoundation.h>
- (void) turnTorchOn: (bool) on {
Class captureDeviceClass = NSClassFromString(#"AVCaptureDevice");
if (captureDeviceClass != nil) {
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device hasTorch] && [device hasFlash]){
[device lockForConfiguration:nil];
if (on) {
[device setTorchMode:AVCaptureTorchModeOn];
[device setFlashMode:AVCaptureFlashModeOn];
torchIsOn = YES;
} else {
[device setTorchMode:AVCaptureTorchModeOff];
[device setFlashMode:AVCaptureFlashModeOff];
torchIsOn = NO;
}
[device unlockForConfiguration];
}
}
}

Resources