簡介
OpenCV 是一個用于(實(shí)時)圖像處理的庫,該模塊簡要介紹了 OpenCV 并演示了其對象檢測功能。這是我們學(xué)習(xí) Python 及其在機(jī)器學(xué)習(xí)和 AI 中的應(yīng)用系列中的第五個模塊。在上一個模塊中,我們認(rèn)識了許多ML和AI中相關(guān)的Python庫,下面就一起來深入研究一下這些庫的使用,我們先開始學(xué)習(xí)OpenCV的使用。
安裝
OpenCV 可以通過 pip 安裝,方法是在 Jupyter Notebook 單元中運(yùn)行以下命令:
!pip install --upgrade opencv-python
pip 是 Python 的默認(rèn)包管理器和獨(dú)立的可執(zhí)行文件,但以這種方式運(yùn)行它可確保將包安裝到 Anaconda 環(huán)境中。
如果軟件包安裝正確,此 Python 代碼應(yīng)該可以正常運(yùn)行:
import cv2
因?yàn)槲覀円谖覀兊?Jupyter Notebook 中顯示圖像,我們還應(yīng)該確保matplotlib
已安裝:
!pip install --upgrade matplotlib
讀取和繪制圖像
讀取 OpenCV 可以處理的圖像很簡單:
import cv2
im = cv2.imread("path/to/image.jpg")
OpenCV 支持多種圖像格式,當(dāng)解析圖像失敗時,結(jié)果imread
將是None
. 請注意,如果未找到圖像文件,則不會引發(fā)錯誤 - 結(jié)果也會如此None
。
假設(shè)找到了圖像,然后我們可以使用matplotlib
. 為此,我們將使用此輔助函數(shù):
from matplotlib import pyplot
def plot_img(img):
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pyplot.imshow(rgb)
OpenCV 讀取 BGR 顏色格式的圖像,但?matplotlib
?希望它們是 RGB,所以首先我們必須轉(zhuǎn)換圖像。然后就可以繪制了。
您可以按如下方式使用此功能:
plot_img(im)
OpenCV 和?matplotlib
?集成如此干凈是因?yàn)?OpenCV 圖像實(shí)際上只是一個包含像素值的多維 NumPy 數(shù)組,并且?matplotlib
?可以使用它。
物體檢測
有很多是OpenCV的可以做。我們將特別關(guān)注對象檢測。
對象檢測與所謂的級聯(lián)分類器一起工作。這種方法使用機(jī)器學(xué)習(xí):分類器在包含所需對象的圖像(正圖像)和不包含它的圖像(負(fù)圖像)上進(jìn)行訓(xùn)練。您可以訓(xùn)練自己的分類器,但 OpenCV 還提供了幾個可從其 GitHub 下載的預(yù)訓(xùn)練模型。
讓我們試試俄羅斯車牌的預(yù)訓(xùn)練分類器haarcascade_russian_plate_number.xml。如果您想要測試圖像,可以使用Sergey Rodovnichenko 的 Lada Vesta 圖像。
我們可以讀取圖像并繪制它以查看是否一切順利,就像以前一樣:
car = cv2.imread("Pictures/lada-vesta.jpg")
plot_img(car)
接下來,我們創(chuàng)建分類器:
蟒蛇復(fù)制代碼
classifier = cv2.CascadeClassifier()
classifier.load("path/to/haarcascade_russian_plate_number.xml")
檢測工作是通過以下?detectMultiScale
?方法完成的:
plates = classifier.detectMultiScale(car)
這將返回一個 NumPy 數(shù)組。它實(shí)際上是一個數(shù)組數(shù)組,每個內(nèi)部數(shù)組都是檢測到的板的矩形邊界,格式為?[ x, y, width, height ]
?. 為了直觀地顯示它們,我們可以在圖像上繪制矩形,然后繪制結(jié)果:
with_indicators = car
for plate in plates:
x, y, width, height = plate
with_indicators = cv2.rectangle(with_indicators, (x, y),
(x + width, y + height),
(0, 0, 255), 5)
矩形函數(shù)采用圖像、左上角坐標(biāo)、右下角坐標(biāo)、顏色和厚度。它返回一個帶有矩形的新圖像。我們可以繪制結(jié)果:
plot_img(with_indicators)
這個例子展示了 OpenCV 的針對俄羅斯車牌的預(yù)訓(xùn)練分類器,但這并不是唯一可用的分類器。還有用于面部、眼睛等的預(yù)訓(xùn)練分類器,它們的使用方式與該分類器完全相同。