App下載

人工智能和機(jī)器學(xué)習(xí)系列(五) OpenCV庫(kù)

陪你演戲 2021-08-24 11:23:03 瀏覽數(shù) (5636)
反饋

簡(jiǎn)介

OpenCV 是一個(gè)用于(實(shí)時(shí))圖像處理的庫(kù),該模塊簡(jiǎn)要介紹了 OpenCV 并演示了其對(duì)象檢測(cè)功能。這是我們學(xué)習(xí) Python 及其在機(jī)器學(xué)習(xí)和 AI 中的應(yīng)用系列中的第五個(gè)模塊。在上一個(gè)模塊中,我們認(rèn)識(shí)了許多ML和AI中相關(guān)的Python庫(kù),下面就一起來(lái)深入研究一下這些庫(kù)的使用,我們先開(kāi)始學(xué)習(xí)OpenCV的使用。

安裝

OpenCV 可以通過(guò) 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 可以處理的圖像很簡(jiǎn)單:

import cv2
im = cv2.imread("path/to/image.jpg")

OpenCV 支持多種圖像格式,當(dāng)解析圖像失敗時(shí),結(jié)果imread將是None. 請(qǐng)注意,如果未找到圖像文件,則不會(huì)引發(fā)錯(cuò)誤 - 結(jié)果也會(huì)如此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í)際上只是一個(gè)包含像素值的多維 NumPy 數(shù)組,并且?matplotlib?可以使用它。

圖 1

物體檢測(cè)

很多是OpenCV的可以做。我們將特別關(guān)注對(duì)象檢測(cè)。

對(duì)象檢測(cè)與所謂的級(jí)聯(lián)分類器一起工作。這種方法使用機(jī)器學(xué)習(xí):分類器在包含所需對(duì)象的圖像(正圖像)和不包含它的圖像(負(fù)圖像)上進(jìn)行訓(xùn)練。您可以訓(xùn)練自己的分類器,但 OpenCV 還提供了幾個(gè)可從其 GitHub 下載的預(yù)訓(xùn)練模型。

讓我們?cè)囋嚩砹_斯車牌的預(yù)訓(xùn)練分類器haarcascade_russian_plate_number.xml。如果您想要測(cè)試圖像,可以使用Sergey Rodovnichenko 的 Lada Vesta 圖像。

我們可以讀取圖像并繪制它以查看是否一切順利,就像以前一樣:

car = cv2.imread("Pictures/lada-vesta.jpg")
plot_img(car)

圖 2

接下來(lái),我們創(chuàng)建分類器:

蟒蛇復(fù)制代碼

classifier = cv2.CascadeClassifier()
classifier.load("path/to/haarcascade_russian_plate_number.xml")

圖 3

檢測(cè)工作是通過(guò)以下?detectMultiScale?方法完成的:

plates = classifier.detectMultiScale(car)

這將返回一個(gè) NumPy 數(shù)組。它實(shí)際上是一個(gè)數(shù)組數(shù)組,每個(gè)內(nèi)部數(shù)組都是檢測(cè)到的板的矩形邊界,格式為?[ 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)、顏色和厚度。它返回一個(gè)帶有矩形的新圖像。我們可以繪制結(jié)果:

plot_img(with_indicators)

圖 4

這個(gè)例子展示了 OpenCV 的針對(duì)俄羅斯車牌的預(yù)訓(xùn)練分類器,但這并不是唯一可用的分類器。還有用于面部、眼睛等的預(yù)訓(xùn)練分類器,它們的使用方式與該分類器完全相同。

結(jié)論

我們只是觸及了 OpenCV 功能的皮毛。OpenCV 具有更多處理功能(轉(zhuǎn)換、過(guò)濾器、2D 特征檢測(cè)等),并且可以實(shí)時(shí)處理視頻幀?;ヂ?lián)網(wǎng)上有很多關(guān)于 OpenCV 的資料。該官方教程是一個(gè)良好的開(kāi)端,但你也可以找到很多的幫助,如果你想與OpenCV的解決問(wèn)題專門進(jìn)行搜索。


0 人點(diǎn)贊