수년전에 iOS에서 OpenCV를 이용해서 작업을 해본적이 있었는데 새로 같은 작은 작업을 하려다보니 다 잊어버려서 OpenCV 프레임워크를 설치하는 과정을 잊어버려서 잊지 않기 위해서, 그리고 새버전의 Swift/Xcode에서 OpenCV와의 연결에 문제가 없는지 확인하기 위해 다시 한번 해보고 아래와 같이 정리 했다.
OpenCV 프레임워크 다운로드
iOS용 OpenCV 프레임워크를 다운 받는다. OpenCV가 버전업 될때마다 친절하게도 iOS용 프레임워크를 빌드해서 다운받을 수 있도록 준비가 되어 있다. 아래 링크에서 프레임워크를 다운 받을 수 있다. 현재 버전은 V4,5,2 최근 버전이 굉장히 빠르게 올라가고 있다. 머신러닝과 관련한 기능들이 많이 추가된것이 원인인듯하다.
다운 받아 압축을 해제 하면 iOS에서 바로 사용할 수 있는 프레임워크 형식의 파일과 폴더로 구성되어 있다.
Xcode 신규 프로젝트 생성
![](http://practical.kr/wp-content/uploads/2021/05/scr1.png)
Xcode에서 OpenCV-Test 라는 이름의 신규 프로젝트를 하나 생성 했다. 내가 쓰고 있는 Xcode의 버전은 12.5이다. 위에서 압축 해제한 OpenCV 프레임워크를 폴더를 생성한 프로젝트 폴더로 이동하고 프로젝트를 선택하고 [Build Phase] 에서 Link Binary With Libraries 의 + 버튼을 눌러서 프로젝트에 포함시킨다.
래퍼클래스 생성
File 메뉴에서 New -> File..을 선택해서 아래 그림과 같은 순서로 CVWrapper를 생성한다.
![](http://practical.kr/wp-content/uploads/2021/05/scr3.png)
![](http://practical.kr/wp-content/uploads/2021/05/scr4-3.png)
이때 주의할점은 Language 에 Swift 대신에 Objecitive-C 언어로 선택을 해주어야만한다. Next를 선택하면 Xcode는 자동으로 브릿지 Header 파일을 생성하겠냐는 메세지를 보여준다. Create Bridging Header를 선택해서 브릿지헤더파일을 생성한다.
![](http://practical.kr/wp-content/uploads/2021/05/scr5.png)
그리고 생성된 CVWrapper.m 파일의 확장자를 CVWrapper.mm 으로 변경해준다.
Prefix Header 파일 생성
![](http://practical.kr/wp-content/uploads/2021/05/scr6.png)
그리고 메뉴에서 File – New – File… 을 선택해서 PCH file을 위 그림과 같이 선택해서 주어진 파일명으로 생성하고 생성된 .pch 파일에 아래와 같은 코드를 삽입한다.
// // PrefixHeader.pch // OpenCV-Test // // Created by Park Billy on 2021/05/07. // #ifndef PrefixHeader_pch #define PrefixHeader_pch #ifdef __cplusplus #include <opencv2/opencv.hpp> #endif #endif /* PrefixHeader_pch */
생성한 Prefix 파일을 컴파일러에 등록해 주어야 하는데 아래의 그림과 같이 Build Settings에서 $(SRCROOT)/프로젝트명/PrefixHeader.pch의 형식으로 등록한다.
![](http://practical.kr/wp-content/uploads/2021/05/scr7.png)
OpenCV 버전확인 하기
아래의 코드를 추가해서 OpenCV의 버전을 가져오는 기능을 만들어 봤다. CVWrapper.h / CVWrapper.mm
// // CVWrapper.h // OpenCV-Test // // Created by Park Billy on 2021/05/07. // #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface CVWrapper : NSObject + (NSString *)openCVVersion; @end NS_ASSUME_NONNULL_END
// // CVWrapper.mm // OpenCV-Test // // Created by Park Billy on 2021/05/07. // #import "CVWrapper.h" #import <opencv2/opencv.hpp> @implementation CVWrapper + (NSString *)openCVVersion { return [NSString stringWithFormat:@"OpenCV Version %s", CV_VERSION]; } @end
ContentView.Swift에서 래퍼클래스의 함수를 호출하여 실제 아이폰 화면에 OpenCV 버전을 보여주는 코드를 아래와 같이 추가했다.
// // ContentView.swift // OpenCV-Test // // Created by Park Billy on 2021/05/07. // import SwiftUI struct ContentView: View { @State var version = "" var body: some View { Text(self.version) .padding() .onAppear(){ self.version = CVWrapper.openCVVersion() } } }
실행결과
실행 결과는 아래와 같다.
![](http://practical.kr/wp-content/uploads/2021/05/scr8-1.png)
실제로 iOS에서 OpenCV 기능을 활용하려면 위의 CVWrapper.h 에 함수를 정의 하고 CVWrapper.mm에 기능을 구현해서 Swift 코드에서 함수를 호출하는 방식으로 사용하면 된다.
소스코드
아래 링크에서 소스 코드를 다운 받을 수 있다. 이 프로젝트를 테스트 하려면 소스에 OpenCV 프레임워크는 포함되어 있지 않으므로 다운 받아서 이글의 첫번째 부분과 같이 프레임워크를 포함시켜야 한다.
https://github.com/bipark/opencv_ios_starter
20210507 박병일