Guía paso a paso para compilar e instalar OpenCV de forma nativa en un Mac con chip Apple Silicon (M1/M2). En general basta con pip install opencv-python, pero cuando ese paquete no trae todos los módulos que necesitas (por ejemplo los módulos "non-free" o los de opencv_contrib), o simplemente quieres exprimir el rendimiento nativo de ARM64, hay que compilarlo desde el código fuente — para eso usamos Miniforge, que da paquetes de Python compilados nativamente para Apple Silicon.

Pasos a seguir:

  1. Homebrew y Xcode Command Line Tools
  2. Instalar Miniforge
  3. Crear un entorno virtual con Python 3.8
  4. Instalar las dependencias necesarias
  5. Compilar e instalar OpenCV
  6. Probar OpenCV

Paso 1: Homebrew y Xcode Command Line Tools

Si no tienes Homebrew instalado:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Luego instala wget y cmake:

brew install wget cmake

Y si no tienes las Xcode Command Line Tools:

xcode-select --install

Paso 2: Instalar Miniforge

Instala Miniforge para arm64 (Apple Silicon) desde su repositorio en GitHub. Miniforge permite instalar paquetes de Python compilados nativamente para Apple Silicon.

Por defecto activa un entorno base; puedes desactivar eso con:

conda config --set auto_activate_base false

Paso 3: Crear un entorno virtual

Crea un entorno llamado testcv con Python 3.8:

conda create --name testcv python=3.8
conda activate testcv

Paso 4: Instalar dependencias

Como vamos a compilar OpenCV de forma nativa, necesitamos la versión de Numpy compatible con Apple Silicon:

conda install -c apple tensorflow-deps

Paso 5: Compilar e instalar OpenCV

Descarga OpenCV y OpenCV Contrib (crea antes una carpeta de trabajo, por ejemplo test_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

Activa tu entorno conda antes de compilar:

conda activate testcv

Necesitas la ruta a tu entorno (puedes obtenerla con echo $CONDA_PREFIX) para indicarle a CMake dónde está tu Python y los módulos de opencv_contrib. Por ejemplo, si tu entorno vive en /ruta/a/tu/miniforge3/envs/testcv, usarías esa misma ruta en las variables de abajo — reemplázala por la tuya:

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=/ruta/a/tu/miniforge3/envs/testcv/opencv_contrib/modules \
  -D PYTHON3_EXECUTABLE=/ruta/a/tu/miniforge3/envs/testcv/bin/python3.8 \
  -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 ..

La compilación con CMake no toma mucho tiempo. Luego corre make (el número después de -j indica cuántos núcleos usar, ajústalo según tu CPU):

make -j8

Esto puede tomar varios minutos. Finalmente instala:

sudo make install

Ubica el archivo .so generado durante la compilación:

mdfind cv2.cpython

Deberías ver algo como /ruta/a/tu/miniforge3/envs/testcv/opencv/build/lib/python3/cv2.cpython-38-darwin.so (verifica la ruta real en tu sistema antes de continuar).

Ve al directorio site-packages de tu entorno:

cd /ruta/a/tu/miniforge3/envs/testcv/lib/python3.8/site-packages

Y crea el enlace simbólico:

ln -s /ruta/a/tu/miniforge3/envs/testcv/opencv/build/lib/python3/cv2.cpython-38-darwin.so .

Verifica que todo quedó bien, en una terminal nueva:

conda activate testcv
python3
import cv2
cv2.__version__

Paso 6: Probar OpenCV

Crea un archivo main.py con el siguiente código (usa una foto cualquiera de prueba):

import cv2

image = cv2.imread('grogu.jpeg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('Original image', image)
cv2.imshow('Gray image', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
python3 main.py

El programa simplemente convierte la imagen a escala de grises y la muestra en pantalla.

Paso adicional: desinstalar

Si necesitas desinstalar OpenCV, desde el directorio build:

sudo make uninstall
conda deactivate
conda remove --name testcv --all

Para validar la instalación en cualquier momento:

python -c "import cv2; print(cv2.getBuildInformation())"