OpenCv-Python 開源計算機視覺庫 (一)

1. 初識 OpenCv

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

2. OpenCV-Python

本文介紹的是 OpenCv 的 Python 接口,即 OpenCV-Python,但它並不是 OpenCv 的 Python 實現,而僅僅是原生 OpenCv C++ 實現的 Python 包裝,也就是說,咱們能夠像普通 Python 模塊同樣導入使用,但後臺運行的依然是 C++ 程序,這樣既發揮了 Python 的簡單易用性,也充分利用了 C++ 的執行高效性,可謂二者兼得。github

值得注意的是,OpenCv-Python 使用 numpy 進行數值運算,全部的 OpenCv(C++)的數組結構都在內部轉換成 numpy 數組。固然,這也使得它更容易與其餘使用 numpy 的庫集成,如:Scipy 和 Matplotlib 。算法

3. 安裝

pip install opencv-python
複製代碼

4. 功能概覽

  • GUI支持: 顯示和保存圖片和視頻,控制鼠標事件和跟蹤欄
  • 核心運算:圖片像素編輯,對圖像執行算術運算,性能優化
  • 圖像處理:顏色空間變化,幾何變換,圖像閾值,平滑處理,漸變,邊緣檢測,融合,輪廓線,直方圖,傅立葉變化,餘弦變換,模版匹配,霍夫線變換,霍夫圓變換,圖像分割,前景提取,
  • 特徵檢測與描述:哈里斯角點檢測,托馬斯角點檢測,SIFT,SURF,ORB,特徵匹配,圖像查找
  • 視頻分析:背景分割,目標追蹤,
  • 相機校準與三維重建:相機校準,姿態預測,極線幾何,圖像提取景深(3維重建)
  • 機器學習:KNN(K 臨近值),SVM(支持向量機), K-Means Clustering(K均值聚類)
  • 計算機影像學:圖像去噪,圖像復原,HDR
  • 目標檢測:人臉識別

5. 基本操做

導入模塊:編程

import cv2 as cv
複製代碼

5.1 圖片打開, 顯示, 保存

使用 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()
複製代碼

5.2 視頻捕獲,播放,保存

5.2.1 捕獲實時視頻流

從筆記本電腦內置攝像頭,捕獲實時視頻流(一張張圖片),並顯示通過灰度處理後的視頻幀,效果就是通過灰度處理後的視頻。

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()
複製代碼

5.2.2 播放視頻文件

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()
複製代碼

5.2.3 保存視頻文件

從視頻輸入設備,如筆記本電腦內置攝像頭,捕獲實時視頻流輸入,進行一幀幀處理後,保存到文件 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()
複製代碼

堅持寫專欄不易,若是以爲本文對你有幫助,記得點個贊。感謝支持!


微信掃描二維碼 獲取最新技術原創

相關文章
相關標籤/搜索