1999年,英特爾的 Gary Bradsky 發起了 OpenCv 項目,並於 2000 年發佈第一個版本。2005年,OpenCv 被首次應用在 Stanley,這也是贏得同年 DARPA 大挑戰賽的車型。現在,OpenCv 除了支持計算機視覺,還增長了衆多機器學習相關算法,將來還將持續擴展。python
OpenCV 支持衆多主流編程語言,如:C++,Python,Java 等,可在不一樣的平臺上使用,包括 Windows,Linux,OS X,Android 和 iOS。此外,基於 CUDA 的高速 GPU 運算接口,和 OpenCL 也在開發當中。git
本文介紹的是 OpenCv 的 Python 接口,即 OpenCV-Python
,但它並不是 OpenCv 的 Python 實現,而僅僅是原生 OpenCv C++ 實現的 Python 包裝,也就是說,咱們能夠像普通 Python 模塊同樣導入使用,但後臺運行的依然是 C++ 程序,這樣既發揮了 Python 的簡單易用性,也充分利用了 C++ 的執行高效性,可謂二者兼得。github
值得注意的是,OpenCv-Python 使用 numpy 進行數值運算,全部的 OpenCv(C++)的數組結構都在內部轉換成 numpy 數組。固然,這也使得它更容易與其餘使用 numpy 的庫集成,如:Scipy 和 Matplotlib 。算法
pip install opencv-python
複製代碼
導入模塊:編程
import cv2 as cv
複製代碼
使用 cv.imread()
打開圖片,返回的是一個 numpy 數組。小程序
img = cv.imread('dog.jpeg')
print(type(img), img.shape)
複製代碼
<class 'numpy.ndarray'> (320, 320, 3)
複製代碼
上面獲得是彩色圖片的 numpy 數組,也能夠直接獲得灰度圖片的 numpy 數組。數組
img_gray = cv.imread('dog.jpeg', 0)
print(type(img_gray), img_gray.shape)
複製代碼
<class 'numpy.ndarray'> (320, 320)
複製代碼
使用 cv.imshow()
顯示圖片,會打開一個窗口 GUI 界面,自動縮放圖片到適合顯示的大小,並跟蹤鼠標移動,在圖片下方跟蹤欄,顯示當前位置和像素值。imshow()
第一個參數是窗口界面標題,以下圖 「image」 。性能優化
cv.imshow('image', img)
cv.waitKey(0)
cv.destroyAllWindows()
複製代碼
若是對讀取的圖片數據(numpy 數組)進行了修改,想保存修改後的圖片保存到磁盤,就須要用到 cv.imwrite()
,函數接收兩個參數,第1個參數爲保存的文件名,第2個參數爲圖像數據,即 numpy 數組。微信
cv.imwrite('dog_gray.png', img_gray)
複製代碼
True
複製代碼
咱們已經知道如何使用 opencv-python 打開,顯示,保存圖片,那麼綜合應用起來,能夠作一個完整的小程序。機器學習
打開並讀取圖片灰度數據,顯示圖片窗口,等待用戶鍵盤輸入,按 ESC
鍵退出,按字母 s
鍵保存灰度圖並退出。
img = cv.imread('dog.jpeg', 0) # 打開灰度圖
cv.imshow('dog', img) # 在窗口顯示圖片
k = cv.waitKey(0) # 持續等待鍵盤事件
if k == 27: # 按 ESC 鍵退出
cv.destroyAllWindows()
elif k == ord('s'): # 按字母 s 鍵保存並退出
cv.imwrite('dog_gray.png',img)
cv.destroyAllWindows()
複製代碼
從筆記本電腦內置攝像頭,捕獲實時視頻流(一張張圖片),並顯示通過灰度處理後的視頻幀,效果就是通過灰度處理後的視頻。
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("沒法打開視頻輸入設備!")
exit()
while True:
# 一幀一幀讀取視頻
ret, frame = cap.read()
# 若是成功讀取到視頻幀,返回 True
if not ret:
print("沒法接收視頻輸入,請檢查是否開啓設備訪問權限。正在退出程序...")
break
# 在此執行對幀的處理操做
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 顯示處理後的幀
cv.imshow("Capture Live Video Stream", gray)
# 按字母 q 鍵退出程序
if cv.waitKey(1) == ord('q'):
break
# 釋放設備訪問,關閉全部窗口
cap.release()
cv.destroyAllWindows()
複製代碼
cap = cv.VideoCapture('dance.mp4')
while cap.isOpened():
# 一幀一幀讀取視頻
ret, frame = cap.read()
# 若是成功讀取到視頻幀,返回 True
if not ret:
print("沒法接收視頻輸入,請檢查是否開啓設備訪問權限。正在退出程序...")
break
# gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('Play Video File', frame)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
複製代碼
從視頻輸入設備,如筆記本電腦內置攝像頭,捕獲實時視頻流輸入,進行一幀幀處理後,保存到文件 output.avi 。
cap = cv.VideoCapture(0)
# 定義編解碼器並建立 VideoWriter 對象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("沒法接收視頻輸入,請檢查是否開啓設備訪問權限。正在退出程序...")
break
# 對每一幀進行垂直翻轉
frame = cv.flip(frame, 0)
# 寫入翻轉後的幀
out.write(frame)
cv.imshow('Capture Live Video Stream', frame)
if cv.waitKey(1) == ord('q'):
break
# 線程結束,釋放全部資源
cap.release()
out.release()
cv.destroyAllWindows()
複製代碼
堅持寫專欄不易,若是以爲本文對你有幫助,記得點個贊。感謝支持!
微信掃描二維碼 獲取最新技術原創