[iPhone 개발 Tip #4] 카메라 AF 상태 체크하기

오늘은 상당히 고급 TIP을 알려드립니다.
현재 구글에서도 이 내용을 검색해봐도 검색 결과가 한 건도 없군요.. ^^

예전 광주과기원(GIST)과 잠깐 같이 일할 기회가 있었는데
iPhone 3GS 카메라 쪽을 Reverse Engineering 할 때 발견했던 내용입니다.

iPhone의 기본 카메라 어플리케이션을 보면
카메라의 노출 변화, 카메라의 움직임 변화(Accelerometer)을 감지해서
자동으로 포커스를 다시 맞추는 기능이 있습니다.
AF 즉, Auto Focus라고 하죠.

이 기능을 위해 Apple은 Framework에 특정 함수로 만들어 놓았습니다.
단, 일반 3rd party 개발용 SDK로 배포하지 않고 Private Framework에 숨겼습니다.

AVCapture라는 비공개 Class에서는
카메라를 통한 사진 캡쳐, 동영상 캡쳐 등등을 담당하고 있고
심지어 현재 비디오 녹화가 되지 않는 iPhone 3G폰(3GS 이전 모델)에서도 이 클래스를 통해 비디오 녹화가 가능하게 할 수 도 있습니다.
사용자가 비디오 Preview의 특정 영역을 터치하여 그 곳을 Focus하도록 하는 함수까지 존재합니다.
그러나 이 모든 것은 Private Framework이기 때문에 사용한다 할지라도 AppStore에 등록이 되질 않을 것입니다.

그러나 오늘 제가 알려드리는 TIP은 이런 Private Framework를 사용하지 않고서도 AF의 상태를 알아낼 수 있는 방법입니다.

바로 NotificationCenter를 이용하는 방법인데요.
아주 간단합니다.
아래와 같이 3가지의 notification name을 이용하는 것입니다.

AVCaptureNotification_FocusStarted,
AVCaptureNotification_FocusCompleted,
AVCaptureNotification_FocusCanceled

NSNotificationCenter * nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(cameraFocusStarted) name:@"AVCaptureNotification_FocusStarted" object:nil];
[nc addObserver:self selector:@selector(cameraFocusEnded) name:@"AVCaptureNotification_FocusCompleted" object:nil];
[nc addObserver:self selector:@selector(cameraFocusCanceled) name:@"AVCaptureNotification_FocusCanceled" object:nil];  

오늘 TIP은 바로 3가지의 notification name을 알려드리는 것이었습니다. ^^

IMG_0190

여러분이 잘 알고 계시는 ScanSearch에서도 제가 이 부분을 사용하였습니다.
그래서 초점이 맞지 않으면 포커스 부분은 깜빡깜빡 거린 것 이구요.
당연히 비공개 함수를 쓰지 않아서 AppStore 등록에도 아무 문제가 없었습니다.

이 기능들을 사용해서 무엇을 만들 수 있을까요?

저는 카메라 대부분에 있는 손떨림 방지 기능을 만들었습니다.
Accelerometer 를 사용하여 흔들림이 적어질 때까지 기다리고 그 순간 AF 상태를 판단하여
초점이 맞은 경우만 사진이 찍히는 것이지요
대부분의 경우 초점이 맞지 않는 사진은 불필요하니까요.

또 다른 Application을 만들 수도 있습니다.
카메라를 고정적으로 가만히 들고 있었는데,
AF 상태가 바뀐 것은 무엇을 의미할까요?
바로 카메라가 비추고 있는 대상이 바뀌었음을 의미합니다.
iPhone 카메라는 똑똑해서 대상이 바뀌어도 AF를 다시 수행하거든요.
이를 이용하면 실시간으로 받아들이는 영상의 KeyFrame을 판단할 수도 있겠습니다.

바코드 프로그램과 같이 실시간으로 카메라 영상을 사용하는 경우에는 그 역할을 톡톡히 하겠죠?

Reverse Engineering이 불법이긴 하지만 참 재미있고 흥미로운 분야이기도 합니다.
남들이 모르는 비밀을 안다는 느낌. 그거 쏠쏠하거든요.. ^^

chaoskcuf
프로그래밍/iPhone 2010/06/07 10:00

트랙백 주소 : http://chaoskcuf.com/trackback/285

댓글을 달아 주세요

  1. 개발20년 2010/11/25 21:02  수정/삭제  댓글쓰기

    "iPhone 카메라는 똑똑해서 대상이 바뀌어도 AF를 다시 수행하거든요. "
    ㅋㅋ....일반 dslr카메라면, 기본적인 기능이죠..그래서..af인겁니다..
    af가무엇의 약자인지는 아시나요? ㅋㅋ...............
    똑똑한게 아니라..님이멍청한겁니다..

    • chaoskcuf 2010/11/26 07:56  수정/삭제

      뭔가 글을 오해하신거 같은데
      안드로이드 단말은 AF가 그렇게 동작하지 않거든요 ^^
      단순히 셔터를 누를 때와 Accelerometer가 움직임을 감시했을 때만 AF를 다시 수행합니다.

  2. 나그네 2011/07/13 23:07  수정/삭제  댓글쓰기

    AVCaptureNotification_FocusStarted,
    AVCaptureNotification_FocusCompleted,
    AVCaptureNotification_FocusCanceled

    해당 userinfo에 해당하는 메시지들이 포커싱이 될때 그리고 완료됬을때 취소됬을때 저 메시지를 던져준다는 것인가요?

    AVCaptureDevice를 이용하여 실시간으로 버퍼프레임을 받아올면서 포커싱이 될때 이벤트를 주려고 하는데
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cameraFocusStarted:) name:@"AVCaptureNotification_FocusStarted" object:nil]; 해주었음에도 불구하고 해당 함수로 콜이 되지 않네요 ... 답변 부탁드리겠습니다.

  3. saqdxdjop 2012/01/24 13:31  수정/삭제  댓글쓰기

    CQ0R9U <a href="http://sdimplfjwzzo.com/">sdimplfjwzzo</a>, [url=http://wdjywhvnksxn.com/]wdjywhvnksxn[/url], [link=http://qkgmzbdpavxg.com/]qkgmzbdpavxg[/link], http://fuxtgdwbefaw.com/

Powerd by Textcube, designed by criuce
rss