1. 程式人生 > >當ROS中的cv2與anaconda3中的cv2衝突時的解決辦法

當ROS中的cv2與anaconda3中的cv2衝突時的解決辦法

今天心血來潮, 想用Anaconda3中的Python3.6.4跑一個opencv小例子, 結果出人意料,出現了ROS中的/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so檔案, 顯然這個是行不通的嘛, 然後我在.bashrc檔案中禁用了ROS環境變數. 結果還是有問題, 就是無法使用Python3來呼叫Anaconda3中通過conda install 安裝的opencv3.3.1版本的cv2, 很是鬱悶.網上搜索一番, 看了幾個stackoverflow上的答案, 實驗表明並不理想. 最後, 沒辦法, 我在這裡重新下載了一個安裝包opencv_python-3.4.0.12-cp36-cp36m-manylinux1_x86_64.whl


然後手動安裝, 注意: 我這裡安裝前, 在~/.bashrc中註釋掉了ROS環境變數, 啟用了anaconda3環境變數, 並source ~/.bashrc. 然後pip3 install opencv_python-3.4.0.12-cp36-cp36m-manylinux1_x86_64.whl手動安裝了這個.
最後在vscode的settings.json中啟用"python.pythonPath": "~/anaconda3/bin/python",註釋掉了其他兩個版本的Python環境變數.
// "python.pythonPath": "/usr/bin/python3",
// "python.pythonPath": "/usr/bin/python",

最後編寫程式,執行良好. 我不知道為什麼原來的opencv3.3.1不能用. 不過我用手動安裝的方法確實解決了問題.
網上通過設定軟連結的方法並不適用與我這個複雜的電腦環境.

import cv2
import numpy as np
print(cv2.__version__)
img = cv2.imread("/home/liuqiang/Documents/Python3/OpenCV/statue_small.jpg", 0)
cv2.imwrite("canny.jpg", cv2.Canny(img, 200, 300))
cv2.imshow("canny", cv2.imread("canny.jpg"
)) cv2.waitKey(0) cv2.destroyAllWindows()

還有幾點需要說明的是:

  • python下呼叫cv2.imread()等函式時,資源需要絕對路徑, 我不知道在Windows下是什麼情況, 至少在我的Ubuntu 16.04下是需要絕對路徑的, 否則會出現如下的錯誤:
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /io/opencv/modules/highgui/src/window.cpp, line 331
Traceback (most recent call last):
  File "/home/liuqiang/Documents/Python3/OpenCV/01_read_and_display_image.py", line 6, in <module>
    cv2.imshow("canny", cv2.imread("canny.jpg"))
cv2.error: /io/opencv/modules/highgui/src/window.cpp:331: error: (-215) size.width>0 && size.height>0 in function imshow

我之前按照這個提示, 用如下的方法雖然解決了錯誤輸出, 但是顯然沒有解決問題, 因為無法輸出影象, 這顯然不科學啊!

import cv2
import numpy as np
print(cv2.__version__)
img = cv2.imread("statue_small.jpg", 0)
if img != None:
    cv2.imwrite("canny.jpg", cv2.Canny(img, 200, 300))
    cv2.imshow("canny", cv2.imread("canny.jpg"))
cv2.waitKey(0)
cv2.destroyAllWindows()

會出現這樣的錯誤:

Traceback (most recent call last):
  File "/home/liuqiang/Documents/Python3/OpenCV/01_read_and_display_image.py", line 5, in <module>
    if img != None:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

最後, 在搜尋答案的過程中, 想起來一年多以前用Python的時候也遇到過這個問題, 記得是載入資源需要絕對路徑的, 當時發現這個問題的解決方法, 但是並沒有記錄下來, 看來學習還是要多做筆記, 不然過後就忘了.