Home >> Blog >> Python opencv-Open Source Computer Vision Library簡述

Python opencv-Open Source Computer Vision Library簡述

wheel上的 OpenCV

為 Python 預構建的僅限 CPU 的 OpenCV 包。

SEO優化的過程中如果您使用到了opencv並且您希望從源程式碼編譯綁定以啟用其他模塊,例如 CUDA,請檢查手動構建部分。

安裝使用

  1. 如果您已安裝以前/其他手動安裝(= 未通過pip)版本的 OpenCV(例如 Python 站點包根目錄中的 cv2 模塊),請在安裝前將其刪除以避免衝突。
  2. 確保您的pip版本是最新的(19.3 是支持的最低版本)pip install --upgrade pip:. 使用 . 檢查版本pip -V。例如,Linux 發行版通常帶有非常舊的pip版本,這會導致很多意想不到的問題,尤其是在manylinux格式方面。
  3. 為您的環境選擇正確的包:

有四種不同的包(請參閱下面的選項 1、2、3 和 4),您應該只選擇其中一個。不要在同一環境中安裝多個不同的軟體包。沒有插件架構:所有包都使用相同的命名空間(cv2)。如果您在同一環境中安裝了多個不同的軟體包,請將它們全部卸載pip uninstall並僅重新安裝一個軟體包。

一個。適用於標準桌面環境的軟體包(Windows、macOS、幾乎所有 GNU/Linux 發行版)

  • 選項 1 - 主要模塊包:pip install opencv-python
  • 選項 2 - 完整包(包含主模塊和 contrib/extra 模塊):(查看OpenCV 文檔pip install opencv-contrib-python中的 contrib/extra 模塊列表)

bay。用於伺服器環境(如 Docker、雲環境等)的包,無 GUI 庫依賴項

這些包比上面的其他兩個包要小,因為它們不包含任何 GUI 功能(未使用 Qt/其他 GUI 組件編譯)。這意味著這些包避免了對 X11 庫的大量依賴鏈,因此您將擁有例如更小的 Docker 映像。如果您不使用cv2.imshowet al,則應始終使用這些軟體包。或者您正在使用 OpenCV 之外的其他包(例如 PyQt)來創建您的 GUI。

  • 選項 3 - no head主模塊包:pip install opencv-python-headless
  • 選項 4 - Headless full package(包含主模塊和 contrib/extra 模塊):(查看OpenCV 文檔pip install opencv-contrib-python-headless中的 contrib/extra 模塊列表)

4.導入包:

import cv2

所有包都包含 Haar 級聯文件。cv2.data.haarcascades可用作數據文件夾的快捷方式。例如:

cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

5.閱讀OpenCV 文檔

6.在打開新問題之前,請閱讀下面的常見問題解答並查看已經打開的其他問題

經常問的問題

問:我還需要單獨安裝 OpenCV 嗎?

答:不,這些包是特殊的 Wheel 二進制包,它們已經包含靜態構建的 OpenCV 二進製文件。

問:Pip 安裝失敗並顯示ModuleNotFoundError: No module named 'skbuild'?

從opencv-python版本 4.3.0.* 開始,manylinux1輪子被輪子取代manylinux2014。如果您的 pip 太舊,它會嘗試使用 4.3.0.38 中引入的新源分發來手動構建 OpenCV,因為它不知道如何安裝manylinux2014輪子。但是,源程式碼構建也會因為太舊而失敗,pip因為它不了解pyproject.toml. 要使用新的manylinux2014預構建輪子(或從源程式碼構建),您的pip版本必須 >= 19.3。請升級pip。pip install --upgrade pip

問:在 Windows 上導入失敗:ImportError: DLL load failed: The specified module could not be found.?

答:如果在 Windows 上導入失敗,請確保您已安裝Visual C++ Redistributable 2015。如果您使用的是比 Windows 10 更舊的 Windows 版本並且未安裝最新的系統更新,則可能還需要通用 C 運行時。

Windows N 和 KN 版本不包括 OpenCV 所需的媒體功能包。如果您使用的是 Windows N 或 KN 版本,請同時安裝Windows Media Feature Pack。

如果您有 Windows Server 2012+,媒體 DLL 可能也丟失了;請在伺服器管理器中安裝名為“媒體基礎”的功能。請注意,有些貼文建議安裝“Windows Server Essentials Media Pack”,但這個需要“Windows Server Essentials Experience”角色,並且該角色將深刻影響您的 Windows Server 配置(通過強制執行活動目錄集成等);所以只安裝“媒體基金會”應該是一個更安全的選擇。

如果上述方法沒有幫助,請檢查您是否使用 Anaconda。舊的 Anaconda 版本存在導致錯誤的錯誤,請參閱此問題以進行手動修復。

如果您在檢查了所有之前的解決方案後仍然遇到錯誤,請下載Dependencies並打開cv2.pyd(通常位於C:\Users\username\AppData\Local\Programs\Python\PythonXX\Lib\site-packages\cv2)文件以調試缺少的 DLL 問題。

問:我還有其他一些導入錯誤?

答:確保您已刪除 OpenCV Python 綁定的舊手動安裝(站點包中的 cv2.so 或 cv2.pyd)。

問:函數 foo() 或方法 bar() 返回錯誤結果,拋出異常或崩潰解釋器。我應該怎麼辦?

答:存儲庫僅包含 OpenCV-Python 包構建腳本,而不包含 OpenCV 本身。OpenCV 的 Python 綁定是在官方 OpenCV 存儲庫中開發的,它是報告問題的最佳場所。在提交新的錯誤之前,請檢查 {OpenCV wiki]( https://github.com/opencv/opencv/wiki ) 和官方 OpenCV 論壇。

問:為什麼軟體包不包含非自由算法?

答:非自由算法(如 SURF)不包含在這些軟體包中,因為它們是專利/非自由算法,因此不能作為內置二進製文件分發。請注意,由於 OpenCV 版本 4.3.0 和 3.4.10 的專利到期,SIFT 包含在構建中。有關更多信息,請參閱此問題:https ://github.com/skvark/opencv-python/issues/126

問:為什麼包和導入不同(opencv-python vs. cv2)?

A:用戶更容易理解,也opencv-python更cv2容易用搜索引擎找到包。cv2(舊 OpenCV 版本中的舊接口被命名為cv)是 OpenCV 開發人員在創建綁定生成器時選擇的名稱。這被保留為導入名稱,以與網際網路上不同類型的教學保持一致。更改導入名稱或行為也會讓習慣於import cv2.

opencv-python 的文檔

這個存儲庫的目的是為最常用的 Python 版本和平台提供打包每個新OpenCV 版本的方法。

CI 構建過程

該項目的結構類似於帶有標准setup.py文件的普通 Python 包。構建矩陣中單個條目的構建過程如下(參見示例.github/workflows/build_wheels_linux.yml文件):

0.在 Linux 和 MacOS 構建中:獲取我們編譯的 OpenCV 的可選 C 依賴項

1.簽出存儲庫和子模塊

  • OpenCV 包含在子模塊中,當發布新的 OpenCV 版本時,維護人員會手動更新版本
  • Contrib 模塊也作為子模塊包含在內

2.從源程式碼中查找 OpenCV 版本

3.構建 OpenCV

  • 測試被禁用,否則構建時間增加太多
  • 每個構建組合有 4 個構建矩陣條目:有和沒有 contrib 模塊,有和沒有 GUI(no head)
  • Linux 構建在許多 Linux Docker 容器(CentOS 5)中運行
  • 源分佈是構建矩陣中的單獨條目

4.重新排列 OpenCV 的構建結果,添加我們的自定義文件並生成輪子

5.Linux和macOS的輪子用auditwheel和delocate進行了相應的轉換

6.安裝生成的輪子

7.測試 Python 是否可以導入庫並運行一些健全性檢查

8.使用 twine 將生成的輪子上傳到 PyPI(僅在發布版本中)

步驟 1--4 由pip wheel.

可以使用環境變量自定義構建。除了 OpenCV 的構建接受的任何變量之外,我們還認識到:

  • CI_BUILD. 設置為1模擬 CI 環境構建行為。僅在 CI 構建中用於強制在setup.py. 除非您知道自己在做什麼,否則不要使用它。
  • ENABLE_CONTRIB和ENABLE_HEADLESS。設置為1構建 contrib 和/或no head版本
  • ENABLE_JAVA, 設置為1啟用 Java 客戶端構建。默認情況下禁用此功能。
  • CMAKE_ARGS. OpenCV 的 CMake 調用的附加參數。您可以使用它來進行自定義構建。

有關在 CI 環境之外手動構建的更多信息,請參閱下一節。

手動構建

如果在預構建的輪子中未啟用某些依賴項,您還可以在本地運行構建以創建自定義輪子。

  1. 克隆此存儲庫:git clone --recursive https://github.com/opencv/opencv-python.git
  2. cd opencv-python
    如果需要,您可以使用在和子模塊git中檢出其他版本的 OpenCVopencvopencv_contrib
  3. 如果需要,添加自定義 Cmake 標誌,例如:(export CMAKE_ARGS="-DSOME_FLAG=ON -DSOME_OTHER_FLAG=OFF"在 Windows 中,您需要根據命令行或 PowerShell 設置不同的環境變量)
  4. 選擇您希望構建的包風格,ENABLE_CONTRIB並且ENABLE_HEADLESS:即export ENABLE_CONTRIB=1如果您希望構建opencv-contrib-python
  5. 運行pip wheel . --verbose。注意:確保您擁有最新pip版本,該命令將替換不支持pip wheel的舊命令。 python setup.py bdist_wheelpyproject.toml
    這可能需要 5 分鐘到 2 多個小時不等,具體取決於您的硬件
  6. 您將在文件dist夾中擁有輪文件,您可以隨心所欲地使用它
    可選:在 Linux 上,如果需要最大的可移植性,則使用一些manylinux映像作為構建主機並auditwheel在構建後運行輪子
    可選:在 macOS 上使用delocate(與 macOS 相同auditwheel但用於 macOS)以獲得更好的可移植性

手動調試構建

為了構建opencv-python未優化的調試版本,您需要稍微避開正常過程。

  1. 安裝軟體包scikit-build並numpy通過 pip。
  2. 運行命令python setup.py bdist_wheel --build-type=Debug。
  3. 將生成的 wheel 文件安裝dist/在pip install dist/wheelname.whl.

如果您希望構建生成所有編譯器命令,那麼以下標誌和環境變量的組合已經過測試,可以在 Linux 上運行:

export CMAKE_ARGS='-DCMAKE_VERBOSE_MAKEFILE=ON'
export VERBOSE=1

python3 setup.py bdist_wheel --build-type=Debug

有關更多討論,請參閱此問題:https ://github.com/opencv/opencv-python/issues/424

源分佈

從 OpenCV 版本 4.3.0 開始,PyPI 中也提供了源程式碼分發。這意味著如果您的系統與 PyPI 中的任何輪子不兼容,pip將嘗試從源程式碼構建 OpenCV。如果您需要 PyPI 中沒有作為源程式碼分發的 OpenCV 版本,請按照上面的手動構建指南而不是這個指南。

您還可以強制pip從源程式碼分發中構建輪子。一些例子:

  • pip install --no-binary opencv-python opencv-python
  • pip install --no-binary :all: opencv-python

如果需要 contrib 模塊或 headless 版本,只需更改包名稱即可(不需要上一節中的第 4 步)。但是,可以通過環境變量提供任何其他 CMake 標誌,如手動構建部分的步驟 3 中所述。如果沒有提供,OpenCV 的 CMake 腳本將嘗試查找並啟用任何合適的依賴項。no head髮行版具有硬編碼的 CMake 標誌,可禁用所有可能的 GUI 依賴項。

在 Raspberry Pi 等慢速系統上,完整構建可能需要幾個小時。在 8 核 Ryzen 7 3700X 上,構建大約需要 6 分鐘。

許可

Opencv-python 包(此存儲庫中的腳本)在 MIT 許可下可用。

OpenCV 本身在Apache 2許可下可用。

第三方軟體包許可證位於LICENSE-3RD-PARTY.txt。

所有車輪都附帶LGPLv2.1許可的FFmpeg。

非no head Linux 輪子隨附有LGPLv3許可的Qt 5。

這些軟體包還包括其他二進製文件。可以從LICENSE-3RD-PARTY.txt找到完整的許可證列表。

版本控制

find_version.py腳本從 OpenCV 源中搜索版本信息,並將特定於此存儲庫的修訂號附加到版本字符串。除了一些其他標誌之外,它還將版本信息保存到version.py文件下。cv2

發布

當一個新標籤被推送到主分支時,發布並上傳到 PyPI。這些標籤區分包(這個 repo 可能有修改,但 OpenCV 版本保持不變)並且應該按順序遞增。在實踐中,發布版本號如下所示:

cv_major.cv_minor.cv_revision.package_revision例如3.1.0.0

主分支遵循 OpenCV 主分支發布。3.4 分支遵循 OpenCV 3.4 錯誤修復版本。

開發構建

將構建此 repo 的 master 分支的每個提交。可能的構建工件使用本地版本標識符:

cv_major.cv_minor.cv_revision+git_hash_of_this_repo例如3.1.0+14a8d39

這些工件不能也不會上傳到 PyPI。

Manylinux 輪子

Linux 輪子是使用manylinux2014 構建的。這些輪子對於大多數發行版(使用 GNU C 標準庫)來說應該是開箱即用的,因為它們是針對舊版本的 glibc 構建的。

默認manylinux2014圖像已通過一些 OpenCV 依賴項進行了擴展。有關詳細信息,請參閱Docker 文件夾。

支持的 Python 版本

為官方支持的 Python 版本(不在 EOL 中)提供了與 Python 3.x 兼容的預構建輪子:

  • 3.6
  • 3.7
  • 3.8
  • 3.9
  • 3.10

向後兼容性

從 4.2.0 和 3.4.9 開始構建 macOS Travis 構建環境已更新到 XCode 9.4。該更改有效地放棄了對 10.13 之前的 macOS 版本的支持。

從 4.3.0 和 3.4.10 開始構建,Linux 構建環境manylinux1從manylinux2014. 這放棄了對舊 Linux 發行版的支持。