希望這篇文章能徹底幫你解決python opencv安裝和使用中的常見問題.
懶人請直奔這一節, 一條命令安裝 opencv
使用python-opencv常用的問題
在linux中使用python版的opencv相信大家都會遇到各種問題, 常見的問題比如:
-
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沒有實現.
最簡單好用的python opencv安裝
下面這個版本是帶nonfree特性(sift, surf) ,contrib功能及一些較新的算法(CSRT跟蹤器), 以及gtk編譯imshow可正常使用的功能,推薦安裝.
可能會用到conda, conda命令不熟悉的歡迎來我這篇文章查一下.
卸載全部其他python版本的opencv
如果你確定沒有安裝過python版的opencv, 那直接跳過這一步就好了.
# 首先看看系統上是否安裝了opencv
# 如果你使用了 conda 環境, 用如下命令列出全部的opencv包
conda list opencv
# 注意: conda列出來的包, 每行末尾有pypi的要通過pip卸載, 沒有pypi的通過conda卸載
# 如果沒有conda, 那就用pip 看一下
pip list | grep opencv
conda list opencv
的結果如下:
# 然后就能看到裝過的各種版本的opencv, 卸載這些opencv
# conda 卸載參考
conda uninstall xxx-opencv-xxx
# pip 卸載參考, 在我上面這張圖中, 需要
pip uninstall opencv-contrib-python
安裝opencv
注意其他的opencv一定要先卸載干凈哦!
注意測試的環境為python3.6, 不保證其他python版本也有此版本的opencv
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)
結果如下圖
點此下載測試代碼及圖片.
好了, 這篇文章到此結束了.