M1 Mac에 OpenCV4 (C++/Python3)를 설치하는 방법

운영 환경


  • M1 MacBookAir(2020)
  • conda(Miniforge)
  • OpenCV4.5(with_contrib)

  • 1. conda 설치


    conda create --name <env_name>
    conda activate <env_name>
    conda install -y python==3.8.6
    

    2. Numpy 설치


    % wget https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha0/tensorflow_macos-0.1alpha0.tar.gz
    % tar xvf tensorflow_macos-0.1alpha0.tar.gz
    % cd tensorflow_macos/arm64
    % pip install --upgrade --no-dependencies --force numpy-1.18.5-cp38-cp38-macosx_11_0_arm64.whl 
    % cd ~
    

    3. OpenCV를 소스에서 컴파일


    % wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.0.zip
    % wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.0.zip
    % unzip opencv.zip
    % unzip opencv_contrib.zip
    % cd opencv-4.5.0
    % mkdir build && cd build
    
    % cmake \
      -DCMAKE_SYSTEM_PROCESSOR=arm64 \
      -DCMAKE_OSX_ARCHITECTURES=arm64 \
      -DWITH_OPENJPEG=OFF \
      -DWITH_IPP=OFF \
      -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D OPENCV_EXTRA_MODULES_PATH=/Users/<user_name>/Downloads/opencv_contrib-4.5.0/modules \
      -D PYTHON3_EXECUTABLE=/Users/<user_name>/miniforge3/envs/dev/bin/python3 \
      -D BUILD_opencv_python2=OFF \
      -D BUILD_opencv_python3=ON \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D INSTALL_C_EXAMPLES=OFF \
      -D OPENCV_ENABLE_NONFREE=ON \
      -D BUILD_EXAMPLES=ON \
      -D OPENCV_GENERATE_PKGCONFIG=ON \
      -D WITH_FFMPEG=ON ..
    % make -j8
    % sudo make install
    

    참고로 [1]에서는 아마 파이썬 버전에서 사용하는 것이 상정되어있는 것 같지만, 나는 C++과 VideoCapture도 사용하고 싶었기 때문에 끝에 -D OPENCV_GENERATE_PKGCONFIG=ON \-D WITH_FFMPEG=ON를 추가했다.

    따라서 C++로 컴파일하기 위해 /usr/local/lib/pkgconfig/opencv4.pc에 대한 경로를 통과합니다.

    ~/.zshrc
    export PKG_CONFIG_PATH==/usr/local/lib/pkgconfig
    source ~/.zshrc
    

    4. 동작 확인


    % conda activate <envi_name>
    % python
    >>> import cv2
    >>> cv2.__version__
    

    파이썬의 경우 4.5.0이 표시되면 OK.

    다음으로 C++.
    Object Detection계에서 C++로 움직이는 좋은 샘플이 없는지 GitHub를 물색한 결과, YOLO를 손쉽게 움직일 수 있는 리포지토리[2]를 발견했다(Detection 이외의 태스크도 거의 망라되고 있다).ObjectDetection-YOLO clone 후 다음을 실행하고 pretraind model을 다운로드 & 컴파일.
    % sh getModels.sh
    % g++ -std=c++11 object_detection_yolo.cpp `pkg-config --cflags --libs opencv4` -o object_detection_yolo
    % ./object_detection_yolo --image=bike.jpg
    


    임의의 이미지로 실행하여 물체 검출되면 OK.

    하나 문제가. . .



    webcam 입력으로 c++에서 Detection하고, AppleSilicon은 그래라고 하는 것을 하고 싶었지만, opencv를 cmake시에 ffmpeg가 인식되지 않고, VideoCapture를 사용할 수 없다는 문제가 발각. 이 이유는 아마도 내 환경에는 x86_64 환경과 arm64 환경의 두 가지 동거 관계에서 /usr/local/bin/ffmpeg (x86_64 컴파일(clang-11.0.0))과 /opt/local/bin/ffmpeg 12.0.0))이 있으며, 전자가 참조되어 있기 때문이라고 생각된다. 인식자가 있으면 해결 방법을 코멘트로 가르쳐 주시면 감사하겠습니다.

    (2021.02.16 추가)
    원인은 예상대로 /usr/local/bin/ffmpeg가 x86_64 컴파일(clang-11.0.0)이기 때문이었지만, 다소 억지였지만, /usr/local/bin/ 때때로 인식되게 되었다.
    또한 다양한 카메라 앱을 넣었기 때문에 cap (0)이 SnapCamera가 된 것도 원인이었다.
    % ffmpeg -list_devices true -f avfoundation -i dummy
    ffmpeg version N-100400-g001bc594d8 Copyright (c) 2000-2020 the FFmpeg developers
      built with Apple clang version 12.0.0 (clang-1200.0.32.27)
      configuration: --prefix=/opt/local
      libavutil      56. 62.100 / 56. 62.100
      libavcodec     58.115.102 / 58.115.102
      libavformat    58. 65.100 / 58. 65.100
      libavdevice    58. 11.103 / 58. 11.103
      libavfilter     7. 93.100 /  7. 93.100
      libswscale      5.  8.100 /  5.  8.100
      libswresample   3.  8.100 /  3.  8.100
    Changed waitThread to realtime priority!
    Asked for all format descriptions...
    [AVFoundation indev @ 0x11d70c7f0] AVFoundation video devices:
    [AVFoundation indev @ 0x11d70c7f0] [0] Snap Camera
    [AVFoundation indev @ 0x11d70c7f0] [1] FaceTime HD Camera
    [AVFoundation indev @ 0x11d70c7f0] [2] EpocCam
    [AVFoundation indev @ 0x11d70c7f0] [3] Capture screen 0
    [AVFoundation indev @ 0x11d70c7f0] [4] Capture screen 1
    

    참고



    [1] Building and Installing OpenCV 4.5.0 on an M1 Mac
    [2] learnopencv/ObjectDetection-YOLO/
    [3] OpenCV를 사용하여 C++ 코드 컴파일(CMake, GCC, pkg-config)
    [4] OpenCV의 C++ 코드를 Mac에서 make 할 때의 Makefile

    좋은 웹페이지 즐겨찾기