計算機視覺
計算機視覺涉及使用計算機軟件和硬件建模和複製人類視覺。 在本章中,我們將詳細地學習。
計算機視覺
計算機視覺是一門學科,根據場景中存在的結構特性,研究如何從2D圖像重構,中斷和理解3D場景。
計算機視覺層次結構
計算機視覺分爲以下三個基本類別 -
- 低級視覺 - 它包括用於特徵提取的過程圖像。
- 中級視覺 - 它包括物體識別和3D場景解釋
- 高級視覺 - 它包括對活動,意圖和行爲等場景的概念性描述。
計算機視覺與圖像處理
圖像處理將圖像轉換爲圖像。 圖像處理的輸入和輸出都是圖像。
計算機視覺是從其圖像中構建對物理對象的明確而有意義的描述。 計算機視覺的輸出是3D場景中結構的描述或解釋。
應用
計算機視覺在以下領域中應用 -
- 機器人領域
- 本地化 - 自動確定機器人位置
- 導航
- 避免障礙
- 裝配(插入孔,焊接,噴漆)
- 操作(例如PUMA機器人操作器)
- 人機器人交互(HRI):智能機器人與人交互和服務
- 醫學領域
- 分類和檢測(例如病變或細胞分類和腫瘤檢測)
- 2D/3D分割
- 3D人體器官重建(MRI或超聲波)
- 視覺引導的機器人手術
- 安全領域
- 生物識別技術(虹膜,指紋,臉部識別)
- 監視 - 檢測某些可疑的活動或行爲
- 運輸
- 自主車輛
- 安全,例如駕駛員警惕性監控
- 工業自動化應用
- 工業檢查(缺陷檢測)
- 部件
- 條碼和包裝標籤閱讀
- 對象排序
- 文件理解(例如OCR)
安裝有用的包
對於使用Python的計算機視覺,您可以使用名爲OpenCV(開源計算機視覺)的流行庫。 它是一個主要針對實時計算機視覺的編程功能庫。 它用C++編寫,其主要接口是C++。 可以藉助以下命令來安裝此軟件包 -
pip install opencv_python-X.X-cp36-cp36m-winX.whl
這裏X代表示機器上安裝的Python版本,以及所擁有的win32或64位版本。
如果您使用的是anaconda環境,請使用以下命令安裝OpenCV -
conda install -c conda-forge opencv
讀取,寫入和顯示圖像
大多數CV應用程序需要將圖像作爲輸入並生成圖像作爲輸出。 在本節中,您將學習如何藉助OpenCV提供的功能來讀取和寫入圖像文件。OpenCV用於讀取,顯示,編寫圖像文件OpenCV爲此提供了以下函數功能 -
imread()
函數 - 這是讀取圖像的函數。 OpenCVimread()
支持各種圖像格式,如PNG,JPEG,JPG,TIFF等。imshow()
函數 - 這是用於在窗口中顯示圖像的函數。 該窗口自動適合圖像大小。 OpenCVimshow()
支持各種圖像格式,如PNG,JPEG,JPG,TIFF等。imwrite()
函數 - 這是寫入圖像的函數。 OpenCVimwrite()
支持各種圖像格式,如PNG,JPEG,JPG,TIFF等。
示例
這個例子展示了用於以一種格式讀取圖像的Python代碼 - 在一個窗口中顯示它,並以其他格式寫入相同的圖像。 考慮下面顯示的步驟 -
如下所示導入OpenCV包 -
import cv2
現在,使用imread()
函數讀取一個特定的圖像 -
image = cv2.imread('image_flower.jpg')
要顯示圖像,可使用imshow()
函數。可以在其中看到圖像的窗口的名稱是image_flower
。
cv2.imshow('image_flower',image)
cv2.destroyAllwindows()
執行代碼後,得到圖片如下 -
可以使用imwrite()
函數將相同的圖像寫入其他格式,比如.png
,
cv2.imwrite('image_flower.png',image)
輸出True
表示圖像已成功寫入.png
文件,並且也位於同一文件夾中。
注 - 函數
destroyallWindows()
簡單地銷燬創建的所有窗口。
色彩空間轉換
在OpenCV中,圖像不是使用傳統的RGB顏色存儲的,而是以相反的順序存儲的,即以BGR順序存儲。 因此,讀取圖像時的默認顏色代碼是BGR。 cvtColor()
顏色轉換函數用於將圖像從一個顏色代碼轉換爲其他顏色代碼。
示例
考慮這個例子,將圖像從BGR轉換爲灰度。
如下所示導入OpenCV包 -
import cv2
使用imread()
函數讀取一個特定的圖像 -
image = cv2.imread('image_flower.jpg')
現在,如果使用imshow()
函數來顯示這個圖像,那麼可以看到這個圖像在BGR中。
cv2.imshow('BGR_Penguins',image)
現在,使用cvtColor()
函數將此圖像轉換爲灰度。
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray_penguins',image)
邊緣檢測
人類在看到粗糙的草圖後,可以輕鬆識別出許多物體類型及其姿態。 這就是爲什麼邊緣在人類生活以及計算機視覺應用中扮演重要角色的原因。 OpenCV提供了非常簡單而有用的函數Canny()
來檢測邊緣。
示例
以下示例顯示了邊緣的清晰標識。
如下所示導入OpenCV包 -
import cv2
import numpy as np
使用imread()
函數讀取一個指定的圖像 -
image = cv2.imread('Penguins.jpg')
現在,使用Canny()
函數來檢測已讀圖像的邊緣。
cv2.imwrite('edges_Penguins.jpg',cv2.Canny(image,200,300))
要顯示具有邊緣的圖像,請使用imshow()
函數,參考以下代碼 -
cv2.imshow('edges', cv2.imread('edges_Penguins.jpg'))
這個Python程序將創建一個名爲edges_penguins.jpg 的圖像並進行邊緣檢測。
人臉檢測
人臉檢測是計算機視覺的令人着迷的應用之一,它使其更加逼真。 OpenCV有一個內置的工具來執行人臉檢測。 我們將使用Haar級聯分類器進行人臉檢測。
Haar級聯數據
我們需要數據來使用Haar級聯分類器。 可以在我們的OpenCV包中找到這些數據。 安裝OpenCv後,有一個文件夾名稱haarcascades
。 將有不同應用程序的.xml
文件。 現在,將它們全部複製以供不同的使用,然後粘貼到當前項目下的新文件夾中。
示例
以下是使用Haar級聯檢測下圖中顯示的Amitabh Bachan的面部的Python代碼 -
如下所示導入OpenCV包 -
import cv2
import numpy as np
現在,使用HaarCascadeClassifier來檢測臉部 -
face_detection=
cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/
haarcascade_frontalface_default.xml')
使用imread()
函數讀取一個指定的圖像,
img = cv2.imread('AB.jpg')
將其轉換爲灰度,因爲它會接受灰色圖像 -
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
接下來,使用face_detection.detectMultiScale
,執行實際的人臉檢測
faces = face_detection.detectMultiScale(gray, 1.3, 5)
圍繞整個臉部繪製一個矩形 -
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)
如圖所示,這個Python程序將創建一個名爲Face_AB.jpg 的圖像,它包含人臉檢測 -
眼睛檢測
眼睛檢測是計算機視覺的另一個引人注目的應用,使其更加逼真和未來。 OpenCV有一個內置的工具來執行眼睛檢測。 我們將使用Haar級聯分類器進行眼睛檢測。
示例
以下示例給出了使用Haar級聯的Python代碼來檢測下圖中給出的Amitabh Bachan 的面部 -
如下所示導入OpenCV包 -
import cv2
import numpy as np
使用HaarCascadeClassifier檢測臉部 -
eye_cascade = cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/haarcascade_eye.xml')
使用imread()
函數讀取指定圖像 -
img = cv2.imread('AB_Eye.jpg')
然後,將其轉換爲灰度,因爲它會接受灰色圖像 -
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
使用 eye_cascade.detectMultiScale
,執行實際的人臉檢測 -
eyes = eye_cascade.detectMultiScale(gray, 1.03, 5)
現在,圍繞整個臉部繪製一個矩形 -
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)
這個Python程序將創建一個名爲Eye_AB.jpg 的圖像,如圖所示,