計算機視覺


計算機視覺涉及使用計算機軟體和硬體建模和複製人類視覺。 在本章中,我們將詳細地學習。

計算機視覺

計算機視覺是一門學科,根據場景中存在的結構特性,研究如何從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()函式 - 這是讀取影象的函式。 OpenCV imread()支援各種影象格式,如PNG,JPEG,JPG,TIFF等。

  • imshow()函式 - 這是用於在視窗中顯示影象的函式。 該視窗自動適合影象大小。 OpenCV imshow()支援各種影象格式,如PNG,JPEG,JPG,TIFF等。

  • imwrite()函式 - 這是寫入影象的函式。 OpenCV imwrite()支援各種影象格式,如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 的影象,如圖所示,