計(jì)算機(jī)視覺涉及使用計(jì)算機(jī)軟件和硬件建模和復(fù)制人類視覺。 在本章中,我們將詳細(xì)地學(xué)習(xí)。
計(jì)算機(jī)視覺是一門學(xué)科,根據(jù)場(chǎng)景中存在的結(jié)構(gòu)特性,研究如何從2D圖像重構(gòu),中斷和理解3D場(chǎng)景。
計(jì)算機(jī)視覺層次結(jié)構(gòu)
計(jì)算機(jī)視覺分為以下三個(gè)基本類別 -
圖像處理將圖像轉(zhuǎn)換為圖像。 圖像處理的輸入和輸出都是圖像。
計(jì)算機(jī)視覺是從其圖像中構(gòu)建對(duì)物理對(duì)象的明確而有意義的描述。 計(jì)算機(jī)視覺的輸出是3D場(chǎng)景中結(jié)構(gòu)的描述或解釋。
應(yīng)用
計(jì)算機(jī)視覺在以下領(lǐng)域中應(yīng)用 -
對(duì)于使用Python的計(jì)算機(jī)視覺,您可以使用名為OpenCV(開源計(jì)算機(jī)視覺)的流行庫。 它是一個(gè)主要針對(duì)實(shí)時(shí)計(jì)算機(jī)視覺的編程功能庫。 它用C++編寫,其主要接口是C++。 可以借助以下命令來安裝此軟件包 -
pip install opencv_python-X.X-cp36-cp36m-winX.whl
這里X代表示機(jī)器上安裝的Python版本,以及所擁有的win32或64位版本。
如果您使用的是anaconda環(huán)境,請(qǐng)使用以下命令安裝OpenCV -
conda install -c conda-forge opencv
大多數(shù)CV應(yīng)用程序需要將圖像作為輸入并生成圖像作為輸出。 在本節(jié)中,您將學(xué)習(xí)如何借助OpenCV提供的功能來讀取和寫入圖像文件。OpenCV用于讀取,顯示,編寫圖像文件OpenCV為此提供了以下函數(shù)功能 -
imread()函數(shù) - 這是讀取圖像的函數(shù)。 OpenCV imread()支持各種圖像格式,如PNG,JPEG,JPG,TIFF等。
imshow()函數(shù) - 這是用于在窗口中顯示圖像的函數(shù)。 該窗口自動(dòng)適合圖像大小。 OpenCV imshow()支持各種圖像格式,如PNG,JPEG,JPG,TIFF等。
imwrite()函數(shù) - 這是寫入圖像的函數(shù)。 OpenCV imwrite()支持各種圖像格式,如PNG,JPEG,JPG,TIFF等。
示例
這個(gè)例子展示了用于以一種格式讀取圖像的Python代碼 - 在一個(gè)窗口中顯示它,并以其他格式寫入相同的圖像。 考慮下面顯示的步驟 -
如下所示導(dǎo)入OpenCV包 -
import cv2
現(xiàn)在,使用imread()函數(shù)讀取一個(gè)特定的圖像 -
image = cv2.imread('image_flower.jpg')
要顯示圖像,可使用imshow()函數(shù)??梢栽谄渲锌吹綀D像的窗口的名稱是image_flower。
cv2.imshow('image_flower',image)
cv2.destroyAllwindows()
執(zhí)行代碼后,得到圖片如下 -

可以使用imwrite()函數(shù)將相同的圖像寫入其他格式,比如.png,
cv2.imwrite('image_flower.png',image)
輸出True表示圖像已成功寫入.png文件,并且也位于同一文件夾中。
注 - 函數(shù)
destroyallWindows()簡(jiǎn)單地銷毀創(chuàng)建的所有窗口。
在OpenCV中,圖像不是使用傳統(tǒng)的RGB顏色存儲(chǔ)的,而是以相反的順序存儲(chǔ)的,即以BGR順序存儲(chǔ)。 因此,讀取圖像時(shí)的默認(rèn)顏色代碼是BGR。 cvtColor()顏色轉(zhuǎn)換函數(shù)用于將圖像從一個(gè)顏色代碼轉(zhuǎn)換為其他顏色代碼。
示例
考慮這個(gè)例子,將圖像從BGR轉(zhuǎn)換為灰度。
如下所示導(dǎo)入OpenCV包 -
import cv2
使用imread()函數(shù)讀取一個(gè)特定的圖像 -
image = cv2.imread('image_flower.jpg')
現(xiàn)在,如果使用imshow()函數(shù)來顯示這個(gè)圖像,那么可以看到這個(gè)圖像在BGR中。
cv2.imshow('BGR_Penguins',image)

現(xiàn)在,使用cvtColor()函數(shù)將此圖像轉(zhuǎn)換為灰度。
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray_penguins',image)

人類在看到粗糙的草圖后,可以輕松識(shí)別出許多物體類型及其姿態(tài)。 這就是為什么邊緣在人類生活以及計(jì)算機(jī)視覺應(yīng)用中扮演重要角色的原因。 OpenCV提供了非常簡(jiǎn)單而有用的函數(shù)Canny()來檢測(cè)邊緣。
示例
以下示例顯示了邊緣的清晰標(biāo)識(shí)。
如下所示導(dǎo)入OpenCV包 -
import cv2
import numpy as np
使用imread()函數(shù)讀取一個(gè)指定的圖像 -
image = cv2.imread('Penguins.jpg')
現(xiàn)在,使用Canny()函數(shù)來檢測(cè)已讀圖像的邊緣。
cv2.imwrite('edges_Penguins.jpg',cv2.Canny(image,200,300))
要顯示具有邊緣的圖像,請(qǐng)使用imshow()函數(shù),參考以下代碼 -
cv2.imshow('edges', cv2.imread('edges_Penguins.jpg'))
這個(gè)Python程序?qū)?chuàng)建一個(gè)名為edges_penguins.jpg 的圖像并進(jìn)行邊緣檢測(cè)。

人臉檢測(cè)是計(jì)算機(jī)視覺的令人著迷的應(yīng)用之一,它使其更加逼真。 OpenCV有一個(gè)內(nèi)置的工具來執(zhí)行人臉檢測(cè)。 我們將使用Haar級(jí)聯(lián)分類器進(jìn)行人臉檢測(cè)。
我們需要數(shù)據(jù)來使用Haar級(jí)聯(lián)分類器。 可以在我們的OpenCV包中找到這些數(shù)據(jù)。 安裝OpenCv后,有一個(gè)文件夾名稱haarcascades。 將有不同應(yīng)用程序的.xml文件。 現(xiàn)在,將它們?nèi)繌?fù)制以供不同的使用,然后粘貼到當(dāng)前項(xiàng)目下的新文件夾中。
示例
以下是使用Haar級(jí)聯(lián)檢測(cè)下圖中顯示的Amitabh Bachan的面部的Python代碼 -

如下所示導(dǎo)入OpenCV包 -
import cv2
import numpy as np
現(xiàn)在,使用HaarCascadeClassifier來檢測(cè)臉部 -
face_detection=
cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/
haarcascade_frontalface_default.xml')
使用imread()函數(shù)讀取一個(gè)指定的圖像,
img = cv2.imread('AB.jpg')
將其轉(zhuǎn)換為灰度,因?yàn)樗鼤?huì)接受灰色圖像 -
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
接下來,使用face_detection.detectMultiScale,執(zhí)行實(shí)際的人臉檢測(cè)
faces = face_detection.detectMultiScale(gray, 1.3, 5)
圍繞整個(gè)臉部繪制一個(gè)矩形 -
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w, y+h),(255,0,0),3)
cv2.imwrite('Face_AB.jpg',img)
如圖所示,這個(gè)Python程序?qū)?chuàng)建一個(gè)名為Face_AB.jpg 的圖像,它包含人臉檢測(cè) -

眼睛檢測(cè)是計(jì)算機(jī)視覺的另一個(gè)引人注目的應(yīng)用,使其更加逼真和未來。 OpenCV有一個(gè)內(nèi)置的工具來執(zhí)行眼睛檢測(cè)。 我們將使用Haar級(jí)聯(lián)分類器進(jìn)行眼睛檢測(cè)。
示例
以下示例給出了使用Haar級(jí)聯(lián)的Python代碼來檢測(cè)下圖中給出的Amitabh Bachan 的面部 -

如下所示導(dǎo)入OpenCV包 -
import cv2
import numpy as np
使用HaarCascadeClassifier檢測(cè)臉部 -
eye_cascade = cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/haarcascade_eye.xml')
使用imread()函數(shù)讀取指定圖像 -
img = cv2.imread('AB_Eye.jpg')
然后,將其轉(zhuǎn)換為灰度,因?yàn)樗鼤?huì)接受灰色圖像 -
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
使用 eye_cascade.detectMultiScale ,執(zhí)行實(shí)際的人臉檢測(cè) -
eyes = eye_cascade.detectMultiScale(gray, 1.03, 5)
現(xiàn)在,圍繞整個(gè)臉部繪制一個(gè)矩形 -
for (ex,ey,ew,eh) in eyes:
img = cv2.rectangle(img,(ex,ey),(ex+ew, ey+eh),(0,255,0),2)
cv2.imwrite('Eye_AB.jpg',img)
這個(gè)Python程序?qū)?chuàng)建一個(gè)名為Eye_AB.jpg 的圖像,如圖所示,
