macOS Xcode에서 OpenCV 사용하기

macOS Xcode에서 OpenCV 사용하기

macOS에 OpenCV 설치 방법은 구글링을 통해 쉽게 빌드 및 설치가 가능하다. 이 포스팅에서는 간단하게 https://github.com/opencv/opencv에서 소스를 받아 빌드하고 설치하는 방법과 더불어 Xcode에서 빌드된 OpenCV 라이브러리 사용 방법을 소개한다.

1. macOS 및 iOS 플랫폼 OpenCV 빌드 및 설치

OpenCV을 GitHub에서 다운로드 받을 디렉토리로 이동해서 다음과 같이 clone 후 빌드 및 설치를 하면 된다. git과 cmake 툴은 미리 설치되어야 한다.

1.1 opencv git clone

$mkdir ~/git
$cd ~/git
$git clone https://github.com/opencv/opencv.git
$cd opencv

1.2 macOS: cmake을 이용한 라이브러리 빌드 및 설치

$mkdir build
$cd build
$cmake ..
$sudo make install
빌드 후에는 헤더파일과 라이브러리 파일은 각각 /usr/local/include/usr/local/lib 에 복사가 된다.

1.3 macOS: python을 이용한 framework 빌드

python을 이용한 빌드에서는 QT UI 라이브러리도 설치되
$python platforms/osx/build_framework.py macOS

1.4 iOS: python을 이용한 framework 빌드

iOS 빌드 방법은 다음과 같다. 빌드가 완료되면 ~/git/opencv/ios 디렉터리에 opencv2.framework이 생성된다.
$python platforms/ios/build_framework.py ios

현재 OpenCV 3.1 iOS 버전은 png 라이브러리를 사용할 때 다음과 같이 링크 에러가 발생할 수 있다. 'Undefined symbols for architecture arm64: "_png_init_filter_functions_neon", referenced from: _png_read_filter_row in opencv2(pngrutil.o)'.

이 문제를 해결하기 위해서는 Git의 Tag 3.1.0으로 checkout 후 빌드 스크립트를 수정하거나 해당 헤더 파일을 수정 방법 중 하나를 선택 후 재빌드한다.

1.4.1 빌드 스크립트 수정

opencv/platforms/ios/build_framework.py 파일 내용 중 일부를 다음과 같이 수정 후 다시 빌드한다.

Before:
    if arch.startswith("armv"):
        cmakecmd.append("-DENABLE_NEON=ON")
After:
    if arch.startswith("armv") or arch.startswith("arm64"):
        cmakecmd.append("-DENABLE_NEON=ON")

1.4.2 pngpriv.h 헤더 파일 수정

opencv/3rdparty/libpng/pngpriv.h 파일 내용 중 다음 부분을 찾은 후

...
#ifdef _ _ ARM_NEON_ _
#define PNG_ARM_NEON_OPT 2
#else
#define PNG_ARM_NEON_OPT 0
#endif
...
아래 내용을 추가 후 다시 빌드한다.
#define PNG_ARM_NEON_OPT 0

2. Xcode 프로젝트 생성 및 환경 설정

Xcode 프로젝트 생성을 위해 'Mastering OpenCV with Practical Computer Vision Projects' 책의 Cartoonifier 예제를 사용한다.

먼저 Xcode을 실행 후 Cartoonifier 프로젝트를 생성한다. 그리고 두 개의 그룹을 만든다. 그룹은 프로젝트 이름을 선택 후 Ctrl+왼쪽마우스버튼 또는 오른쪽마우스버튼을 누르면 팝업메뉴에서 선택할 수 있다.

      

그리고 src 그룹에 'Add Files to "Cartoonifier"...' 메뉴를 선택해서 다음과 같이 5개의 소스 파일과 헤더파일을 추가한다.

 

그리고 opencv 라이브러리들을 등록한다. 이전에 만들었던 framework 그룹에 opencv 그룹을 하나 더 만들고, 다음과 같이 opencv의 Shared Library 들을 등록한다. Cartoonifier 에서는 등록된 모든 Shared Library을 사용하지 않지만 다른 프로젝트들을 위해 모두 포함시켰다.


참고로 macOS에서는 Shared Library의 확장자는 .dylib 이다. 프로젝트에 포함된 OpenCV의 Shared Library 들은 /usr/local/lib 디렉터리에 있다.

그리고 프로젝트 속성에서 참조할 Header 파일 경로와 Library 파일 경로를 설정한다. 아래 그림처럼 왼쪽에 있는 'Project Navigator'에서 프로젝트 이름인  'Cartoonifier'을 선택하면 중안에 프로젝트 속성 설정이 나타난다. 'TARGETS'에 있는 'Cartoonifier'을 선택 후에 'Build Settings' 탭을 선택한다. 그리고 'Search Paths' 항목에서 'Header Search Paths'와 'Library Search Paths' 항목을 설정한다.
  • Header Search Paths: /usr/local/include/ /usr/local/include/opencv/
  • Library Search Paths: /usr/local/lib/



3. 실행

빌드 오류가 없다면 'RUN' 버튼을 누르면 macOS에서 실행되는 Cartoonifier 프로그램을 만날 수 있다.



4. Xcode 프로젝트 소스 코드

아래 소스코드를 다운로드 후 압축을 푼 후 Cartoonifier_Desktop/xcode/Cartoonifier.xcodeproj 프로젝트 파일을 선택하면 된다.

5. Reference

댓글

  1. 안녕하세요! 혼자 따라보고 실습하는 학생입니다.
    다름이 아니라 1.3 mac OS: python을 이용한 framework 빌드 와 1.4 iOS: python을 이용한 framework 빌드 부분에서 Type error 오류가 나 질문드립니다. 혹시 작업하실 때 에러가 나신 적 있으신지 문의드립니다.

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

macOS가 갑자기 부팅이 되지 않을 경우 데이터 복구 또는 백업 방법

C++로 프로그래밍할 때 인자 또는 리턴 값으로 std::vector 등 STL 데이터 타입 처리하는 좋은 방법

Git 저장소를 병합하는 방법(How to merge repositories in Git)