본문 바로가기
프로그래밍/iOS

iOS에서 OpenCV 사용하기

by 백룡화검 2013. 7. 2.

출처 : http://thefermata.net/?p=997


아이폰에서 OpenCV를 사용하려면 우선 iOS용 OpenCV Framework가 필요합니다. OpenCV 공식홈페이지 또는 SourceForge에서 다운로드 가능합니다.

압축을 풀어서 framework 폴더 통째로 프로젝트에 추가.

srcrt1

링크 되게 Add to targets 항목 확인 후 추가합니다.

srcrt2

 

이제 같이 사용할 라이브러리들을 추가해 주어야 합니다.
QuartzCore, Accelerate, AssetsLibrary, AVFoundation, CoreMedia, CoreImage, CoreVideo

srcrt3

 

빌드 설정을 해야하는데, OpenCV를 사용하려면 Objective C++를 사용해야합니다.

 

srcrt4

 

간단하게 OpenCV의 Canny를 활용해서 실시간으로 카메라 입력의 외곽선을 따오는 것을 해봤습니다.

먼저 ViewController.h입니다. 이미지를 출력할 UIImageView 하나와 CvVideoCamera 하나를 사용할 겁니다.
그리고 camera의 delegate사용을 위해 CvVideoCameraDelegate를 선언합니다.
http://thefermata.net/?p=994 에서처럼 core, imageproc, highgui를 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#import <UIKit/UIKit.h>
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/imgproc_c.h>
#import <opencv2/highgui/cap_ios.h>
#import <opencv2/core/core_c.h>
using namespace cv;
 
@interface ViewController : UIViewController<CvVideoCameraDelegate>{
    IBOutlet UIImageView *cameraView;
    CvVideoCamera *camera;
}
@property (nonatomic, retain) CvVideoCamera *camera;
@end

다음은  ViewController.m입니다. viewDidLoad에서 CvVideoCamera를 생성하고 설정값을 준 뒤 바로 캡처를 시작합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
...(생략)...
 
@synthesize camera;
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    camera = [[CvVideoCamera alloc] initWithParentView:cameraView];
    camera.delegate = self;
    camera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack; //장치 설정
    camera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480; //사이즈 설정
    camera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait; //방향 설정
    camera.defaultFPS = 30; // 프레임률
    [camera start];
}
 
- (void)processImage:(Mat&)image;
{
    //여기서 opencv 작업을 함
    Mat image_copy;
    Mat image_copy2;
    cvtColor(image, image_copy, CV_BGRA2GRAY); //흑백 1채널로 변환
    cvtColor(image, image_copy2, CV_BGRA2GRAY);
    Canny(image_copy2,image_copy,200,200); //외곽선 따기
    bitwise_not(image_copy, image_copy);
    cvtColor(image_copy, image, CV_GRAY2BGRA);
}
 
...(생략)...

그리고 storyboard로 가서 ViewController에 UIImageView를 하나 그려준 뒤 cameraView outlet을 연결해주세요.

srcrt5

 

이제 실행해봅니다. (시뮬레이터에는 카메라가 없기때문에 테스트가 불가능하니 실제 단말에서 테스트하셔야합니다.)

test

 

실행 결과입니다.

 

여담이지만 요즘은 증강현실에 관심이 생겨서 한동안은 OpenCV 열심히 가지고 놀것 같습니다ㅋㅋㅋ