From 675bbcf01649844d68bb319c62728767bc77a612 Mon Sep 17 00:00:00 2001 From: Ayush Rajput Date: Thu, 15 Jan 2026 17:32:39 +0530 Subject: [PATCH 1/7] solved #1138 by Adding missing Windows GStreamer build documentation --- README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/README.md b/README.md index 6de64d64b..f69354ada 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,38 @@ If some dependency is not enabled in the pre-built wheels, you can also run the - Optional: on Linux use some of the `manylinux` images as a build hosts if maximum portability is needed and run `auditwheel` for the wheel after build - Optional: on macOS use ``delocate`` (same as ``auditwheel`` but for macOS) for better portability +#### Building with GStreamer on Windows + +To build opencv-python with GStreamer support on Windows, you must install +the official GStreamer MSVC binaries and make them available to CMake during +the build process. + +**Prerequisites** +- Windows 10 or later (64-bit) +- Visual Studio 2019 or newer (MSVC) +- CMake +- Python (matching the target wheel version) +- GStreamer 1.x MSVC (runtime + development packages) + +**Install GStreamer** +Download and install both the **runtime** and **development** installers for +GStreamer 1.x (MSVC 64-bit) from the official GStreamer website. + +**Environment variables** +Before building, ensure the following paths are available: + +set PATH=C:\gstreamer\1.0\msvc_x86_64\bin;%PATH% +set GST_PLUGIN_PATH=C:\gstreamer\1.0\msvc_x86_64\lib\gstreamer-1.0 + +Adjust paths if GStreamer is installed in a different location. + +**Build** +Run the standard manual build command: + +If GStreamer is detected correctly, the CMake output will indicate that +GStreamer support is enabled. + + #### Manual debug builds In order to build `opencv-python` in an unoptimized debug build, you need to side-step the normal process a bit. From 72c1f44bae97a22d19869bbcb7098af985f0ead9 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov <2536374+asmorkalov@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:10:35 +0300 Subject: [PATCH 2/7] Merge pull request #1269 from asmorkalov:as/linux_arm_cloud Migrate Linux ARM build to cloud too (#1269) Use new docker image with fixed permissions on ARM. --- .github/workflows/build_wheels_manylinux.yml | 8 ++++---- docker/manylinux2014/Dockerfile_aarch64 | 6 +++--- docker/manylinux_2_28/Dockerfile_aarch64 | 6 +++--- docker/musllinux_1_2/Dockerfile_aarch64 | 13 ++++--------- 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build_wheels_manylinux.yml b/.github/workflows/build_wheels_manylinux.yml index 1e795174c..3e55aa834 100644 --- a/.github/workflows/build_wheels_manylinux.yml +++ b/.github/workflows/build_wheels_manylinux.yml @@ -17,7 +17,7 @@ on: jobs: Build: - runs-on: ${{ matrix.platform == 'aarch64' && 'opencv-cn-lin-arm64' || 'ubuntu-22.04' }} + runs-on: ${{ matrix.platform == 'aarch64' && 'ubuntu-22.04-arm' || 'ubuntu-22.04' }} defaults: run: shell: bash @@ -33,7 +33,7 @@ jobs: include: - platform: aarch64 manylinux: 2014 - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64:20260725 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64:20260901 - platform: x86_64 manylinux: 2014 DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20260725 @@ -42,7 +42,7 @@ jobs: DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-x86-64:20260725 - platform: aarch64 manylinux: 2_28 - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64:20260725 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64:20260901 env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true @@ -86,7 +86,7 @@ jobs: Test: needs: [Build] - runs-on: ${{ matrix.platform == 'aarch64' && 'opencv-cn-lin-arm64' || 'ubuntu-22.04' }} + runs-on: ${{ matrix.platform == 'aarch64' && 'ubuntu-24.04-arm' || 'ubuntu-22.04' }} defaults: run: shell: bash diff --git a/docker/manylinux2014/Dockerfile_aarch64 b/docker/manylinux2014/Dockerfile_aarch64 index b8dc69ed6..9e646fe81 100644 --- a/docker/manylinux2014/Dockerfile_aarch64 +++ b/docker/manylinux2014/Dockerfile_aarch64 @@ -1,4 +1,4 @@ -# Version: 20260725 +# Version: 20260901 # Image name: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64 FROM quay.io/pypa/manylinux2014_aarch64:latest @@ -157,8 +157,8 @@ RUN curl -O -L https://github.com/ccache/ccache/releases/download/v${CCACHE_VERS cd ../.. && \ rm -rf ccache-${CCACHE_VERSION} ccache-${CCACHE_VERSION}.tar.gz -# Self-hosted runner UID is 1004 -RUN useradd ci -m -s /bin/bash -G users --uid=1004 && \ +# GitHub Actions user`s UID is 1001 +RUN useradd ci -m -s /bin/bash -G users --uid=1001 && \ mkdir /io && \ chown -R ci:ci /io && \ # This needs to find ffmpeg packages from ci user diff --git a/docker/manylinux_2_28/Dockerfile_aarch64 b/docker/manylinux_2_28/Dockerfile_aarch64 index fba959c13..a3f5287f1 100644 --- a/docker/manylinux_2_28/Dockerfile_aarch64 +++ b/docker/manylinux_2_28/Dockerfile_aarch64 @@ -1,4 +1,4 @@ -# Version: 20260725 +# Version: 20260901 # Image name: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64 FROM quay.io/pypa/manylinux_2_28_aarch64:latest @@ -105,8 +105,8 @@ RUN mkdir ~/ffmpeg_sources && \ ldconfig && \ rm -rf ~/ffmpeg_sources -# Self-hosted runner UID is 1004 -RUN useradd ci -m -s /bin/bash -G users --uid=1004 && \ +# GitHub Actions user`s UID is 1001 +RUN useradd ci -m -s /bin/bash -G users --uid=1001 && \ mkdir /io && \ chown -R ci:ci /io && \ # This needs to find ffmpeg packages from ci user diff --git a/docker/musllinux_1_2/Dockerfile_aarch64 b/docker/musllinux_1_2/Dockerfile_aarch64 index fc4ef7c59..f7cdee49c 100644 --- a/docker/musllinux_1_2/Dockerfile_aarch64 +++ b/docker/musllinux_1_2/Dockerfile_aarch64 @@ -1,4 +1,4 @@ -# version: 20260725 +# version: 20260901 # Image name: quay.io/opencv-ci/opencv-python-musllinux_1_2-aarch64 FROM quay.io/pypa/musllinux_1_2_aarch64:latest @@ -161,14 +161,9 @@ RUN curl -O -L https://github.com/ccache/ccache/releases/download/v${CCACHE_VERS cd ../.. && \ rm -rf ccache-${CCACHE_VERSION} ccache-${CCACHE_VERSION}.tar.gz -# Self-hosted runner UID is 1004 -RUN useradd ci -m -s /bin/bash -G users --uid=1004 && \ - mkdir /io && \ - chown -R ci:ci /io && \ - # This needs to find ffmpeg packages from ci user - chown -R ci:ci /ffmpeg_build && \ - # This calls in mutlibuild scripts and cannot be run without permissions - chown -R ci:ci /opt/_internal/pipx/venvs/auditwheel +# user`s UID is 1001 +RUN adduser -D -u 1001 ci && mkdir /io && chown ci:ci /io && \ + chown -R ci:ci /ffmpeg_build USER ci From 597ce8e2eac30fe6ce8294472fa533ee3937c86f Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov <2536374+asmorkalov@users.noreply.github.com> Date: Wed, 2 Sep 2026 13:45:48 +0300 Subject: [PATCH 3/7] Migrate Mac Intel builds to cloud. (#1270) --- .github/workflows/build_wheels_macos.yml | 36 ++++++++++++++---------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build_wheels_macos.yml b/.github/workflows/build_wheels_macos.yml index 4a96dd3e3..e573848e6 100644 --- a/.github/workflows/build_wheels_macos.yml +++ b/.github/workflows/build_wheels_macos.yml @@ -18,11 +18,11 @@ on: jobs: Build: - runs-on: python-macos-intel + runs-on: macos-15-intel strategy: fail-fast: false matrix: - python-version: ['3.9'] + python-version: ['3.10'] platform: [x64] with_contrib: [0, 1] without_gui: [0, 1] @@ -46,6 +46,9 @@ jobs: ENABLE_CONTRIB: ${{ matrix.with_contrib }} PIP_INDEX_URL: https://pypi.tuna.tsinghua.edu.cn/simple steps: + - uses: actions/setup-python@v7 + with: + python-version: ${{ matrix.python-version }} - name: Cleanup run: find . -mindepth 1 -delete working-directory: ${{ github.workspace }} @@ -65,8 +68,9 @@ jobs: echo $ENABLE_CONTRIB > contrib.enabled echo $ENABLE_HEADLESS > headless.enabled export MACOSX_DEPLOYMENT_TARGET=14.0 - python${{ matrix.python-version }} -m pip install toml && python${{ matrix.python-version }} -c 'import toml; c = toml.load("pyproject.toml"); print("\n".join(c["build-system"]["requires"]))' | python${{ matrix.python-version }} -m pip install -r /dev/stdin - python${{ matrix.python-version }} setup.py bdist_wheel --py-limited-api=cp37 --dist-dir=wheelhouse -v + python --version + python -m pip install delocate toml && python -c 'import toml; c = toml.load("pyproject.toml"); print("\n".join(c["build-system"]["requires"]))' | python -m pip install -r /dev/stdin + python setup.py bdist_wheel --py-limited-api=cp37 --dist-dir=wheelhouse -v delocate-wheel ${{ github.workspace }}/wheelhouse/opencv* - name: Saving a wheel accordingly to matrix uses: actions/upload-artifact@v7 @@ -76,11 +80,11 @@ jobs: Test: needs: [Build] - runs-on: python-macos-intel + runs-on: macos-15-intel strategy: fail-fast: false matrix: - python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] + python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] platform: [x64] with_contrib: [0, 1] without_gui: [0, 1] @@ -88,14 +92,15 @@ jobs: env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true MB_PYTHON_VERSION: ${{ matrix.python-version }} - NP_TEST_DEP: numpy==1.19.4 - NP_TEST_DEP_LATEST: numpy==2.2.6 CONFIG_PATH: travis_config.sh PLAT: x86_64 OPENCV_TEST_DATA_PATH: ${{ github.workspace }}/opencv_extra/testdata PYLINT_TEST_FILE: ${{ github.workspace }}/opencv/samples/python/squares.py PIP_INDEX_URL: https://pypi.tuna.tsinghua.edu.cn/simple steps: + - uses: actions/setup-python@v7 + with: + python-version: ${{ matrix.python-version }} - name: Cleanup run: find . -mindepth 1 -delete working-directory: ${{ github.workspace }} @@ -112,25 +117,26 @@ jobs: - name: Create Venv for test run: | test -d "${{ github.workspace }}/opencv_test" && rm -rf "${{ github.workspace }}/opencv_test" - python${{ matrix.python-version }} -m venv ${{ github.workspace }}/opencv_test + python -m venv ${{ github.workspace }}/opencv_test - name: Package installation run: | source ${{ github.workspace }}/opencv_test/bin/activate - python${{ matrix.python-version }} -m pip install --upgrade pip - python${{ matrix.python-version }} -m pip install --no-cache --force-reinstall wheelhouse/opencv*.whl + python --version + python -m pip install --upgrade pip + python -m pip install --no-cache --force-reinstall wheelhouse/opencv*.whl cd ${{ github.workspace }}/tests - python${{ matrix.python-version }} get_build_info.py + python get_build_info.py - name: Run tests run: | source ${{ github.workspace }}/opencv_test/bin/activate cd ${{ github.workspace }}/opencv - python${{ matrix.python-version }} modules/python/test/test.py -v --repo . + python modules/python/test/test.py -v --repo . - name: Pylint test run: | source ${{ github.workspace }}/opencv_test/bin/activate - python${{ matrix.python-version }} -m pip install pylint==2.15.9 + python -m pip install pylint==2.15.9 cd ${{ github.workspace }}/tests - python${{ matrix.python-version }} -m pylint $PYLINT_TEST_FILE + python -m pylint $PYLINT_TEST_FILE Release_rolling: if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} From 031876bd46b781b8f4db2075327e5a78a53dff63 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov <2536374+asmorkalov@users.noreply.github.com> Date: Fri, 4 Sep 2026 11:16:50 +0300 Subject: [PATCH 4/7] Drop dedicated pipeline for Mac ARM, use matrix build. (#1271) --- .github/workflows/build_wheels_macos.yml | 19 +- .github/workflows/build_wheels_macos_m1.yml | 192 -------------------- 2 files changed, 9 insertions(+), 202 deletions(-) delete mode 100644 .github/workflows/build_wheels_macos_m1.yml diff --git a/.github/workflows/build_wheels_macos.yml b/.github/workflows/build_wheels_macos.yml index e573848e6..c52bfe343 100644 --- a/.github/workflows/build_wheels_macos.yml +++ b/.github/workflows/build_wheels_macos.yml @@ -1,4 +1,4 @@ -name: macOS x86_64 +name: MacOS on: pull_request: @@ -8,7 +8,6 @@ on: paths-ignore: - '.github/workflows/build_wheels_manylinux*' - '.github/workflows/build_wheels_windows*' - - '.github/workflows/build_wheels_macos_m1.yml' release: types: [published, edited] schedule: @@ -18,12 +17,12 @@ on: jobs: Build: - runs-on: macos-15-intel + runs-on: ${{ matrix.platform == 'arm64' && 'macos-15' || 'macos-15-intel' }} strategy: fail-fast: false matrix: python-version: ['3.10'] - platform: [x64] + platform: [x86_64, arm64] with_contrib: [0, 1] without_gui: [0, 1] build_sdist: [0] @@ -40,7 +39,7 @@ jobs: CONFIG_PATH: travis_config.sh USE_CCACHE: 1 UNICODE_WIDTH: 32 - PLAT: x86_64 + PLAT: ${{ matrix.platform }} SDIST: ${{ matrix.build_sdist || 0 }} ENABLE_HEADLESS: ${{ matrix.without_gui }} ENABLE_CONTRIB: ${{ matrix.with_contrib }} @@ -75,17 +74,17 @@ jobs: - name: Saving a wheel accordingly to matrix uses: actions/upload-artifact@v7 with: - name: wheel-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} + name: wheel-${{ matrix.platform }}-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} path: wheelhouse/opencv*.whl Test: needs: [Build] - runs-on: macos-15-intel + runs-on: ${{ matrix.platform == 'arm64' && 'macos-15' || 'macos-15-intel' }} strategy: fail-fast: false matrix: python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] - platform: [x64] + platform: [x86_64, arm64] with_contrib: [0, 1] without_gui: [0, 1] build_sdist: [0] @@ -93,7 +92,7 @@ jobs: ACTIONS_ALLOW_UNSECURE_COMMANDS: true MB_PYTHON_VERSION: ${{ matrix.python-version }} CONFIG_PATH: travis_config.sh - PLAT: x86_64 + PLAT: ${{ matrix.platform }} OPENCV_TEST_DATA_PATH: ${{ github.workspace }}/opencv_extra/testdata PYLINT_TEST_FILE: ${{ github.workspace }}/opencv/samples/python/squares.py PIP_INDEX_URL: https://pypi.tuna.tsinghua.edu.cn/simple @@ -112,7 +111,7 @@ jobs: - name: Download a wheel accordingly to matrix uses: actions/download-artifact@v8 with: - name: wheel-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} + name: wheel-${{ matrix.platform }}-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} path: wheelhouse/ - name: Create Venv for test run: | diff --git a/.github/workflows/build_wheels_macos_m1.yml b/.github/workflows/build_wheels_macos_m1.yml deleted file mode 100644 index 9c8c670f2..000000000 --- a/.github/workflows/build_wheels_macos_m1.yml +++ /dev/null @@ -1,192 +0,0 @@ -name: macOS ARM64 - -on: - pull_request: - branches: - - 4.x - - 5.x - paths-ignore: - - '.github/workflows/build_wheels_manylinux*' - - '.github/workflows/build_wheels_windows*' - - '.github/workflows/build_wheels_macos.yml' - release: - types: [published, edited] - schedule: - - cron: '0 3 * * 6' - workflow_dispatch: - - -jobs: - Build: - runs-on: python-macos12-m1 - strategy: - fail-fast: false - matrix: - python-version: ['3.9'] - platform: [x64] - with_contrib: [0, 1] - without_gui: [0, 1] - build_sdist: [0] - env: - CI_BUILD: 1 - SDIST: ${{ matrix.build_sdist || 0 }} - ENABLE_HEADLESS: ${{ matrix.without_gui }} - ENABLE_CONTRIB: ${{ matrix.with_contrib }} - PIP_INDEX_URL: https://pypi.tuna.tsinghua.edu.cn/simple - steps: - - name: Cleanup - run: find . -mindepth 1 -delete - working-directory: ${{ github.workspace }} - - name: Setup environment - run: | - if [[ "${{ github.event_name }}" == "schedule" || "${{ github.event_name }}" == "workflow_dispatch" ]]; then - echo "ENABLE_ROLLING=1" >> $GITHUB_ENV - fi - - name: Checkout - uses: actions/checkout@v7 - with: - submodules: false - fetch-depth: 0 - - name: Build a package - run: | - git submodule update --init multibuild - echo $ENABLE_CONTRIB > contrib.enabled - echo $ENABLE_HEADLESS > headless.enabled - export MACOSX_DEPLOYMENT_TARGET=13.0 - python${{ matrix.python-version }} -m pip install toml && python${{ matrix.python-version }} -c 'import toml; c = toml.load("pyproject.toml"); print("\n".join(c["build-system"]["requires"]))' | python${{ matrix.python-version }} -m pip install -r /dev/stdin - python${{ matrix.python-version }} setup.py bdist_wheel --py-limited-api=cp37 --dist-dir=wheelhouse -v - delocate-wheel ${{ github.workspace }}/wheelhouse/opencv* - - name: Saving a wheel accordingly to matrix - uses: actions/upload-artifact@v7 - with: - name: wheel-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} - path: wheelhouse/opencv*.whl - - Test: - needs: [Build] - runs-on: python-macos12-m1 - strategy: - fail-fast: false - matrix: - python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] - platform: [x64] - with_contrib: [0, 1] - without_gui: [0, 1] - build_sdist: [0] - env: - OPENCV_TEST_DATA_PATH: ${{ github.workspace }}/opencv_extra/testdata - PYLINT_TEST_FILE: ${{ github.workspace }}/opencv/samples/python/squares.py - PIP_INDEX_URL: https://pypi.tuna.tsinghua.edu.cn/simple - steps: - - name: Cleanup - run: find . -mindepth 1 -delete - working-directory: ${{ github.workspace }} - - name: Checkout - uses: actions/checkout@v7 - with: - submodules: true - fetch-depth: 0 - - name: Download a wheel accordingly to matrix - uses: actions/download-artifact@v8 - with: - name: wheel-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} - path: wheelhouse/ - - name: Create Venv for test - run: | - test -d "${{ github.workspace }}/opencv_test" && rm -rf "${{ github.workspace }}/opencv_test" - python${{ matrix.python-version }} -m venv ${{ github.workspace }}/opencv_test - - name: Package installation - run: | - source ${{ github.workspace }}/opencv_test/bin/activate - python${{ matrix.python-version }} -m pip install --upgrade pip - python${{ matrix.python-version }} -m pip install --no-cache --force-reinstall wheelhouse/opencv*.whl - cd ${{ github.workspace }}/tests - python${{ matrix.python-version }} get_build_info.py - - name: Run tests - run: | - source ${{ github.workspace }}/opencv_test/bin/activate - cd ${{ github.workspace }}/opencv - python${{ matrix.python-version }} modules/python/test/test.py -v --repo . - - name: Pylint test - run: | - source ${{ github.workspace }}/opencv_test/bin/activate - python${{ matrix.python-version }} -m pip install pylint==2.15.9 - cd ${{ github.workspace }}/tests - python${{ matrix.python-version }} -m pylint $PYLINT_TEST_FILE - - Release_rolling: - if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} - needs: [Build, Test] - runs-on: ubuntu-22.04 - environment: opencv-python-rolling-release - defaults: - run: - shell: bash - steps: - - uses: actions/download-artifact@v8 - with: - name: wheels - path: wheelhouse/ - - name: Upload wheels for opencv_python_rolling - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_PYTHON_ROLLING_USERNAME }} -p ${{ secrets.OPENCV_PYTHON_ROLLING_PASSWORD }} --skip-existing wheelhouse/wheel-*/opencv_python_rolling-* - - name: Upload wheels for opencv_contrib_python_rolling - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_CONTRIB_PYTHON_ROLLING_USERNAME }} -p ${{ secrets.OPENCV_CONTRIB_PYTHON_ROLLING_PASSWORD }} --skip-existing wheelhouse/wheel-*/opencv_contrib_python_rolling-* - - name: Upload wheels for opencv_python_headless_rolling - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_PYTHON_HEADLESS_ROLLING_USERNAME }} -p ${{ secrets.OPENCV_PYTHON_HEADLESS_ROLLING_PASSWORD }} --skip-existing wheelhouse/wheel-*/opencv_python_headless_rolling-* - - name: Upload wheels for opencv_contrib_python_headless_rolling - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_CONTRIB_PYTHON_HEADLESS_ROLLING_USERNAME }} -p ${{ secrets.OPENCV_CONTRIB_PYTHON_HEADLESS_ROLLING_PASSWORD }} --skip-existing wheelhouse/wheel-*/opencv_contrib_python_headless_rolling-* - - Pre-release: - if: github.event_name == 'release' && github.event.release.prerelease - needs: [Build, Test] - runs-on: ubuntu-22.04 - environment: test-opencv-python-release - defaults: - run: - shell: bash - steps: - - uses: actions/download-artifact@v8 - with: - path: wheelhouse/ - - name: Upload all wheels - run: | - tree - python -m pip install twine - python -m twine upload --repository testpypi -u ${{ secrets.PYPI_USERNAME }} -p ${{ secrets.PYPI_PASSWORD }} --skip-existing wheelhouse/wheel-*/opencv_* - - Release: - if: github.event_name == 'release' && !github.event.release.prerelease - needs: [Build, Test] - runs-on: ubuntu-22.04 - environment: opencv-python-release - defaults: - run: - shell: bash - steps: - - uses: actions/download-artifact@v8 - with: - path: wheelhouse/ - - name: Upload wheels for opencv_python - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_PYTHON_USERNAME }} -p ${{ secrets.OPENCV_PYTHON_PASSWORD }} --skip-existing wheelhouse/wheel-*/opencv_python-* - - name: Upload wheels for opencv_contrib_python - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_CONTRIB_PYTHON_USERNAME }} -p ${{ secrets.OPENCV_CONTRIB_PYTHON_PASSWORD }} --skip-existing wheelhouse/wheel-*/opencv_contrib_python-* - - name: Upload wheels for opencv_python_headless - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_PYTHON_HEADLESS_USERNAME }} -p ${{ secrets.OPENCV_PYTHON_HEADLESS_PASSWORD }} --skip-existing wheelhouse/wheel-*/opencv_python_headless-* - - name: Upload wheels for opencv_contrib_python_headless - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_CONTRIB_PYTHON_HEADLESS_USERNAME }} -p ${{ secrets.OPENCV_CONTRIB_PYTHON_HEADLESS_PASSWORD }} --skip-existing wheelhouse/wheel-*/opencv_contrib_python_headless-* From b583a17f629fc1efc7e3d16f3a8e8243784a9451 Mon Sep 17 00:00:00 2001 From: Rohit Singh Rajput Date: Mon, 9 Nov 2026 18:42:20 +0530 Subject: [PATCH 5/7] Merge pull request #1283 from Rohit4507:patch-1 docs(readme): point documentation links at docs.opencv.org --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 09c6734ff..b92e7f06d 100644 --- a/README.md +++ b/README.md @@ -37,14 +37,14 @@ Check the manual build section if you wish to compile the bindings from source t **a.** Packages for standard desktop environments (Windows, macOS, almost any GNU/Linux distribution) - Option 1 - Main modules package: ``pip install opencv-python`` - - Option 2 - Full package (contains both main modules and contrib/extra modules): ``pip install opencv-contrib-python`` (check contrib/extra modules listing from [OpenCV documentation](https://docs.opencv.org/master/)) + - Option 2 - Full package (contains both main modules and contrib/extra modules): ``pip install opencv-contrib-python`` (check contrib/extra modules listing from [OpenCV documentation](https://docs.opencv.org/)) **b.** Packages for server (headless) environments (such as Docker, cloud environments etc.), no GUI library dependencies These packages are smaller than the two other packages above because they do not contain any GUI functionality (not compiled with Qt / other GUI components). This means that the packages avoid a heavy dependency chain to X11 libraries and you will have for example smaller Docker images as a result. You should always use these packages if you do not use `cv2.imshow` et al. or you are using some other package (such as PyQt) than OpenCV to create your GUI. - Option 3 - Headless main modules package: ``pip install opencv-python-headless`` - - Option 4 - Headless full package (contains both main modules and contrib/extra modules): ``pip install opencv-contrib-python-headless`` (check contrib/extra modules listing from [OpenCV documentation](https://docs.opencv.org/master/)) + - Option 4 - Headless full package (contains both main modules and contrib/extra modules): ``pip install opencv-contrib-python-headless`` (check contrib/extra modules listing from [OpenCV documentation](https://docs.opencv.org/)) 4. Import the package: @@ -54,7 +54,7 @@ Check the manual build section if you wish to compile the bindings from source t ``cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")`` -5. Read [OpenCV documentation](https://docs.opencv.org/master/) +5. Read [OpenCV documentation](https://docs.opencv.org/) 6. Before opening a new issue, read the FAQ below and have a look at the other issues which are already open. From 58fd880f0b7819b3404076615af7018fcbfea569 Mon Sep 17 00:00:00 2001 From: Ivan Avdeev Date: Wed, 11 Nov 2026 08:41:37 +0200 Subject: [PATCH 6/7] Update Docker images to 20261110 (#1285) - FFmpeg 8.1.3, libpng 1.6.59, freetype 2.15.0, dav1d 1.5.4, aom v3.15.3 - ccache 4.14.3 where built from source - manylinux2014 x86_64: NASM 2.15.04 -> 2.16.03 (aligned with other images) - musllinux: libvpx v1.15.1 -> v1.15.2; aom kept at v3.14.1 (v3.15.3 fails to build on musl) - Fix stale image tag in sdist job (20260102 -> 20261110) --- .github/workflows/build_wheels_manylinux.yml | 10 +++++----- docker/manylinux2014/Dockerfile_aarch64 | 14 +++++++------- docker/manylinux2014/Dockerfile_x86_64 | 16 ++++++++-------- docker/manylinux_2_28/Dockerfile_aarch64 | 12 ++++++------ docker/manylinux_2_28/Dockerfile_x86_64 | 12 ++++++------ docker/musllinux_1_2/Dockerfile_aarch64 | 14 +++++++------- docker/musllinux_1_2/Dockerfile_x86_64 | 14 +++++++------- 7 files changed, 46 insertions(+), 46 deletions(-) diff --git a/.github/workflows/build_wheels_manylinux.yml b/.github/workflows/build_wheels_manylinux.yml index 3e55aa834..d614c28a9 100644 --- a/.github/workflows/build_wheels_manylinux.yml +++ b/.github/workflows/build_wheels_manylinux.yml @@ -33,16 +33,16 @@ jobs: include: - platform: aarch64 manylinux: 2014 - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64:20260901 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64:20261110 - platform: x86_64 manylinux: 2014 - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20260725 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20261110 - platform: x86_64 manylinux: 2_28 - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-x86-64:20260725 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-x86-64:20261110 - platform: aarch64 manylinux: 2_28 - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64:20260901 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64:20261110 env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true @@ -165,7 +165,7 @@ jobs: NP_TEST_DEP: numpy==1.19.4 TRAVIS_BUILD_DIR: ${{ github.workspace }} CONFIG_PATH: travis_config.sh - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20260102 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20261110 USE_CCACHE: 1 UNICODE_WIDTH: 32 SDIST: ${{ matrix.build_sdist || 0 }} diff --git a/docker/manylinux2014/Dockerfile_aarch64 b/docker/manylinux2014/Dockerfile_aarch64 index 9e646fe81..b99c7362f 100644 --- a/docker/manylinux2014/Dockerfile_aarch64 +++ b/docker/manylinux2014/Dockerfile_aarch64 @@ -1,20 +1,20 @@ -# Version: 20260901 +# Version: 20261110 # Image name: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64 FROM quay.io/pypa/manylinux2014_aarch64:latest -ARG CCACHE_VERSION=4.13.6 -ARG FFMPEG_VERSION=8.1.2 -ARG FREETYPE_VERSION=2.14.3 -ARG LIBPNG_VERSION=1.6.58 +ARG CCACHE_VERSION=4.14.3 +ARG FFMPEG_VERSION=8.1.3 +ARG FREETYPE_VERSION=2.15.0 +ARG LIBPNG_VERSION=1.6.59 ARG VPX_VERSION=v1.15.2 ARG NASM_VERSION=2.16.03 ARG OPENSSL_VERSION=1_1_1w ARG QT_VERSION=5.15.19 ARG YASM_VERSION=1.3.0 -ARG AOM_VERSION=v3.14.1 +ARG AOM_VERSION=v3.15.3 ARG AVIF_VERSION=v1.4.2 -ARG LIBDAV1D_VERSION=1.5.3 +ARG LIBDAV1D_VERSION=1.5.4 ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH diff --git a/docker/manylinux2014/Dockerfile_x86_64 b/docker/manylinux2014/Dockerfile_x86_64 index ab42b5c45..71dc87d76 100644 --- a/docker/manylinux2014/Dockerfile_x86_64 +++ b/docker/manylinux2014/Dockerfile_x86_64 @@ -1,20 +1,20 @@ -# Version: 20260725 +# Version: 20261110 # Image name: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64 FROM quay.io/pypa/manylinux2014_x86_64:latest -ARG CCACHE_VERSION=4.13.6 -ARG FFMPEG_VERSION=8.1.2 -ARG FREETYPE_VERSION=2.14.3 -ARG LIBPNG_VERSION=1.6.58 +ARG CCACHE_VERSION=4.14.3 +ARG FFMPEG_VERSION=8.1.3 +ARG FREETYPE_VERSION=2.15.0 +ARG LIBPNG_VERSION=1.6.59 ARG VPX_VERSION=v1.15.2 -ARG NASM_VERSION=2.15.04 +ARG NASM_VERSION=2.16.03 ARG OPENSSL_VERSION=1_1_1w ARG QT_VERSION=5.15.19 ARG YASM_VERSION=1.3.0 -ARG AOM_VERSION=v3.14.1 +ARG AOM_VERSION=v3.15.3 ARG AVIF_VERSION=v1.4.2 -ARG LIBDAV1D_VERSION=1.5.3 +ARG LIBDAV1D_VERSION=1.5.4 ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH diff --git a/docker/manylinux_2_28/Dockerfile_aarch64 b/docker/manylinux_2_28/Dockerfile_aarch64 index a3f5287f1..f8a82ffa4 100644 --- a/docker/manylinux_2_28/Dockerfile_aarch64 +++ b/docker/manylinux_2_28/Dockerfile_aarch64 @@ -1,16 +1,16 @@ -# Version: 20260901 +# Version: 20261110 # Image name: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64 FROM quay.io/pypa/manylinux_2_28_aarch64:latest -ARG FFMPEG_VERSION=8.1.2 -ARG FREETYPE_VERSION=2.14.3 -ARG LIBPNG_VERSION=1.6.58 +ARG FFMPEG_VERSION=8.1.3 +ARG FREETYPE_VERSION=2.15.0 +ARG LIBPNG_VERSION=1.6.59 ARG VPX_VERSION=v1.15.2 ARG QT_VERSION=5.15.19 -ARG AOM_VERSION=v3.14.1 +ARG AOM_VERSION=v3.15.3 ARG AVIF_VERSION=v1.4.2 -ARG LIBDAV1D_VERSION=1.5.3 +ARG LIBDAV1D_VERSION=1.5.4 ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH diff --git a/docker/manylinux_2_28/Dockerfile_x86_64 b/docker/manylinux_2_28/Dockerfile_x86_64 index 8bec5deea..3f3b0f2a2 100644 --- a/docker/manylinux_2_28/Dockerfile_x86_64 +++ b/docker/manylinux_2_28/Dockerfile_x86_64 @@ -1,16 +1,16 @@ -# Version: 20260725 +# Version: 20261110 # Image name: quay.io/opencv-ci/opencv-python-manylinux_2_28-x86-64 FROM quay.io/pypa/manylinux_2_28_x86_64:latest -ARG FFMPEG_VERSION=8.1.2 -ARG FREETYPE_VERSION=2.14.3 -ARG LIBPNG_VERSION=1.6.58 +ARG FFMPEG_VERSION=8.1.3 +ARG FREETYPE_VERSION=2.15.0 +ARG LIBPNG_VERSION=1.6.59 ARG VPX_VERSION=v1.15.2 ARG QT_VERSION=5.15.19 -ARG AOM_VERSION=v3.14.1 +ARG AOM_VERSION=v3.15.3 ARG AVIF_VERSION=v1.4.2 -ARG LIBDAV1D_VERSION=1.5.3 +ARG LIBDAV1D_VERSION=1.5.4 ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH diff --git a/docker/musllinux_1_2/Dockerfile_aarch64 b/docker/musllinux_1_2/Dockerfile_aarch64 index f7cdee49c..7ba002c80 100644 --- a/docker/musllinux_1_2/Dockerfile_aarch64 +++ b/docker/musllinux_1_2/Dockerfile_aarch64 @@ -1,18 +1,18 @@ -# version: 20260901 +# version: 20261110 # Image name: quay.io/opencv-ci/opencv-python-musllinux_1_2-aarch64 FROM quay.io/pypa/musllinux_1_2_aarch64:latest -ARG CCACHE_VERSION=4.13.6 -ARG FFMPEG_VERSION=8.1.2 -ARG FREETYPE_VERSION=2.14.3 -ARG LIBPNG_VERSION=1.6.58 -ARG VPX_VERSION=v1.15.1 +ARG CCACHE_VERSION=4.14.3 +ARG FFMPEG_VERSION=8.1.3 +ARG FREETYPE_VERSION=2.15.0 +ARG LIBPNG_VERSION=1.6.59 +ARG VPX_VERSION=v1.15.2 ARG NASM_VERSION=2.16.03 ARG OPENSSL_VERSION=1_1_1w ARG YASM_VERSION=1.3.0 ARG AOM_VERSION=v3.14.1 ARG AVIF_VERSION=v1.4.2 -ARG LIBDAV1D_VERSION=1.5.3 +ARG LIBDAV1D_VERSION=1.5.4 ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH diff --git a/docker/musllinux_1_2/Dockerfile_x86_64 b/docker/musllinux_1_2/Dockerfile_x86_64 index 2761baea0..afc29ee20 100644 --- a/docker/musllinux_1_2/Dockerfile_x86_64 +++ b/docker/musllinux_1_2/Dockerfile_x86_64 @@ -1,18 +1,18 @@ -# version: 20260725 +# version: 20261110 # Image name: quay.io/opencv-ci/opencv-python-musllinux_1_2-x86-64 FROM quay.io/pypa/musllinux_1_2_x86_64:latest -ARG CCACHE_VERSION=4.13.6 -ARG FFMPEG_VERSION=8.1.2 -ARG FREETYPE_VERSION=2.14.3 -ARG LIBPNG_VERSION=1.6.58 -ARG VPX_VERSION=v1.15.1 +ARG CCACHE_VERSION=4.14.3 +ARG FFMPEG_VERSION=8.1.3 +ARG FREETYPE_VERSION=2.15.0 +ARG LIBPNG_VERSION=1.6.59 +ARG VPX_VERSION=v1.15.2 ARG NASM_VERSION=2.16.03 ARG OPENSSL_VERSION=1_1_1w ARG YASM_VERSION=1.3.0 ARG AOM_VERSION=v3.14.1 ARG AVIF_VERSION=v1.4.2 -ARG LIBDAV1D_VERSION=1.5.3 +ARG LIBDAV1D_VERSION=1.5.4 ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH From 1dd520f6954838cc316fcd50be943db4097b9141 Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Wed, 11 Nov 2026 02:29:20 -0500 Subject: [PATCH 7/7] Allow current Setuptools on Python 3.12 and newer (#1275) The Setuptools upper bound prevents source builds in environments that constrain build dependencies to a current release. Remove it so those builds can use Setuptools 81. A headless wheel built and passed an installed import and resize check on macOS arm64 with CPython 3.12, Setuptools 81, scikit-build 0.19.1, and Wheel 0.48.0. The same checks also passed with Wheel 0.41.3, reusing the native build tree. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ff65d7763..5c92837a4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ requires = [ "pip", "scikit-build>=0.14.0", "setuptools==59.2.0; python_version<'3.12'", - "setuptools<70.0.0; python_version>='3.12'", + "setuptools; python_version>='3.12'", ] # use a custom backend to manage CMake check / installation # see https://scikit-build.readthedocs.io/en/latest/usage.html#adding-cmake-as-building-requirement-only-if-not-installed-or-too-low-a-version