更新於 2024/10/05閱讀時間約 8 分鐘

[OpenCV][Python]使用opencv-contrib-python報錯紀錄

通常發生在先安裝opencv-contrib-python,在接著安裝opencv-python會發生報錯。

雖然先前也發生一樣的事情,但在換電腦後重新安裝時,也發生同樣的錯誤XD。

報錯訊息

AttributeError: module 'cv2.dnn_superres' has no attribute 'DnnSuperResImpl_create'

以上情況通常與 OpenCV 和其額外模組的版本不兼容或安裝不完整有關。

opencv-contrib-python 是 OpenCV 的擴展版本,包含額外的功能模組(如面部識別、SIFT/SURF 等專有演算法),而 opencv-python 只包含核心模組。


可能的原因包括:

  1. 版本不匹配:如果你安裝了某個版本的 opencv-contrib-python,然後又安裝了不同版本的 opencv-python,這兩者之間的版本不兼容會導致功能無法正常工作。重新安裝正確版本的 opencv-contrib-python 後,會使 OpenCV 回到一個穩定的狀態。
  2. 不完整的安裝:在某些情況下,opencv-contrib-python 安裝過程可能沒有成功完成,可能是因為網絡問題或依賴關係未正確解決。重新安裝可能會解決這些問題。
  3. 多次安裝衝突:如果你曾多次安裝或卸載不同版本的 OpenCV,有可能會殘留某些文件,導致模組之間的衝突。這時,重新安裝 opencv-contrib-python 能夠清除衝突並恢復正常。
  4. 環境問題:你可能有多個 Python 環境,且每個環境有不同版本的 OpenCV。在某個環境中安裝或運行時,版本的衝突可能會導致程式無法執行。重新安裝可確保在正確的環境下使用正確的模組。

除了 cv2.dnn_superres 模組,以下這些模組也可能會遇到類似的問題:

  1. cv2.face:這是 OpenCV 中的面部識別模組,如果你使用的 opencv-pythonopencv-contrib-python 版本不支持,它可能會顯示沒有該模組的錯誤。
  2. cv2.bgsegm:這是背景分割的模組,用於移動目標的檢測。它也是 opencv-contrib-python 中的一部分,版本不匹配時可能會遇到 AttributeError
  3. cv2.text:這個模組包含了 OpenCV 中的文字檢測和識別算法,如 OCR。如果 opencv-contrib-python 安裝不完整,它也可能無法使用。
  4. cv2.aruco:這是用於處理 Aruco 標記的模組,也屬於 opencv-contrib-python,出錯的原因可能是版本或模組不匹配。
  5. cv2.xfeatures2d:這個模組包含一些進階的特徵檢測演算法(如 SIFT 和 SURF),這些演算法需要特定版本的 opencv-contrib-python 才能正確使用。

解決方法:

  • 確認安裝版本:確保你安裝的是兼容版本的 opencv-contrib-python,可以使用以下指令檢查版本:
    pip show opencv-python opencv-contrib-python
  • 重新安裝 opencv-contrib-python:確保你的 OpenCV 安裝完整,尤其是需要使用擴展模組時,重新安裝 opencv-contrib-python 可能有助於解決問題:
    pip uninstall opencv-python opencv-contrib-python
    pip install opencv-python
    pip install opencv-contrib-python
  • 版本控制:嘗試指定特定的版本,例如:
    pip install opencv-contrib-python==4.5.3.56

如果你確定使用正確的版本並且仍然遇到問題,請考慮升級或降級 OpenCV 的版本來解決兼容性問題。


檢查已安裝的 OpenCV 套件版本

你可以使用 pip show 指令來檢查已安裝的 OpenCV 相關套件版本:

這將會顯示以下類似的輸出:

這將會顯示以下類似的輸出:

Name: opencv-python
Version: 4.10.0.84
Summary: Wrapper package for OpenCV python bindings.
...

Name: opencv-contrib-python
Version: 4.10.0.84
Summary: Wrapper package for OpenCV python bindings with extra modules.
...

重點在於這兩個套件的版本號必須完全一致,比如上面的版本號都是 4.10.0.84。如果 opencv-pythonopencv-contrib-python 的版本不一致,可能會導致功能無法使用或出現錯誤。

最後整理完資料,發現其實只安裝opencv-contrib-python就好了

這是因為:


  • opencv-python 包含的是 OpenCV 的核心功能,例如基本的圖像處理、影像操作等。
  • opencv-contrib-python 包含了 opencv-python 的所有核心功能 以及額外的擴展模組(contrib modules),這些擴展模組包括例如 SIFT、SURF、面部識別等功能,這些在 opencv-python 中是沒有的。


因此,當你安裝了 opencv-contrib-python 時,它自帶所有的 OpenCV 核心功能和擴展模組,你不需要再單獨安裝 opencv-python。如果你先安裝了 opencv-contrib-python,但之後又安裝了 opencv-python,後者可能會覆蓋前者的安裝,因為 opencv-python 會安裝較少的模組,而這樣可能會導致你原本需要的擴展功能無法使用。


為什麼只安裝 opencv-contrib-python 就夠了?

  1. 完整性opencv-contrib-python 包含了所有 opencv-python 的核心模組功能,並且額外包含了來自 contrib 的擴展模組。
  2. 避免衝突:如果你同時安裝了兩者,opencv-python 可能會覆蓋掉 opencv-contrib-python 中的某些擴展模組,從而導致你無法使用特定的功能,像你提到的 cv2.dnn_superres 就屬於 contrib 擴展模組。
  3. 維護方便:只安裝 opencv-contrib-python 可以避免版本不一致的問題,因為它已經包含了所有必要的模組。這樣可以減少維護和排除錯誤的麻煩。


參考文獻






分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.