但願這篇文章能完全幫你解決python opencv安裝和使用中的常見問題.html
懶人請直奔這一節, 一條命令安裝 opencvpython
在linux中使用python版的opencv相信你們都會遇到各類問題, 常見的問題好比:linux
imshow 沒法使用, 會出現以下警告. 這是由於python-opencv沒有編譯gtk, 網上的解決方法可能會推薦你從新編譯什麼的, 太過麻煩, 也不必定能解決.
cv2.error: OpenCV(4.1.0) /io/opencv/modules/highgui/src/window.cpp:627: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'算法
一些opencv的nonfree特性沒法使用, 比方說 SIFT, SURF 等等, 以及一些較新的算法如CSRT沒有實現.bash
下面這個版本是帶nonfree特性(sift, surf) ,contrib功能及一些較新的算法(CSRT跟蹤器), 以及gtk編譯imshow可正常使用的功能,推薦安裝.app
可能會用到conda, conda命令不熟悉的歡迎來我這篇文章查一下.測試
若是你肯定沒有安裝過python版的opencv, 那直接跳過這一步就行了.ui
# 首先看看系統上是否安裝了opencv # 若是你使用了 conda 環境, 用以下命令列出所有的opencv包 conda list opencv # 注意: conda列出來的包, 每行末尾有pypi的要經過pip卸載, 沒有pypi的經過conda卸載 # 若是沒有conda, 那就用pip 看一下 pip list | grep opencv
conda list opencv
的結果以下:
google
# 而後就能看到裝過的各類版本的opencv, 卸載這些opencv # conda 卸載參考 conda uninstall xxx-opencv-xxx # pip 卸載參考, 在我上面這張圖中, 須要 pip uninstall opencv-contrib-python
注意其餘的opencv必定要先卸載乾淨哦!code
pip install opencv-contrib-python==3.4.2.16
這樣就安裝好啦, 很簡單是吧, 其實最關鍵的問題就是找到這個特殊的版本.
opencv-contrib-python
是帶contrib特性的opencv版本, 3.4.2.16這個版本(在google上大量搜索後找到的)是python opencv中知足上面這些需求的最後一個版本(截止到2019-10我測試過的). 歡迎你們多多測試其餘的新版本, 有更新的版本歡迎在留言中請說明一下.
若是想經過conda安裝, 只推薦conda -c menpo python3 不過只有3.1版本, 而且有功能缺失, 建議pip安裝, 效果是同樣的, 也能夠安裝進conda的虛擬環境中.
固然這種安裝方式也是有缺點的, 那即是沒法使用opencv4中的一些新特性, 但對大多數人來講, opencv3應該能知足絕大多數需求啦.
# 查看opencv版本 python -c "import cv2; print(cv2.__version__)"
若是出現 cv2._version__
這個屬性不存在的問題, 檢查一些opencv是否徹底卸載乾淨, 必定要所有卸載完, 再從新安裝.
好了, 如今安裝完畢, 來個簡單的SIFT代碼測試一下看看.
import cv2 print("opencv version:", cv2.__version__) # opencv version: 3.4.2 img1 = cv2.imread('1.png') img2 = cv2.imread('2.png') # Initiate SIFT detector sift = cv2.xfeatures2d.SIFT_create() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) # BFMatcher with default params bf = cv2.BFMatcher() matches = bf.knnMatch(des1,des2, k=2) # Apply ratio test good = [] for m,n in matches: if m.distance < 0.75*n.distance: good.append([m]) # cv2.drawMatchesKnn expects list of lists as matches. result = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2) cv2.imshow('result', result) cv2.imwrite("result.jpg", result) cv2.waitKey(0)
結果以下圖
點此下載測試代碼及圖片.
好了, 這篇文章到此結束了.