小白入門計算機視覺(一) : 10分鐘入門opencv


最近突然對計算機視覺感興趣了,所以就自己摸索着學習一下,先來點有趣的吧,太難的還沒學會,嘿嘿!!!
什麼是計算機視覺呢?簡而言之就是讓計算機擁有人能所見、人能所識、人能所思的能力,就可以稱計算機擁有視覺,即計算 機視覺。再說的直白一點就是讓計算機能夠識別圖片和視頻然後像人類大腦一樣經過算法的處理可以獲取需要的信息,並對圖片和視頻做出一些判斷。

計算機視覺的應用

就目前所瞭解到的來講,計算機主要有五大應用:
圖像分類:圖像分類架構–卷積神經網絡(CNN)
目標檢測: R-CNN
目標跟蹤:均值漂移算法,即meanshift
語義分割:FCN
實例分割:Mask R-CNN

認識opencv

提到計算機視覺可能我們第一時間能想到的就是opencv庫,opencv是C++寫的代碼,也是一個比較經典的圖像處理庫,從最經典的圖像算法到非常前沿的 DL 預訓練模型囊括了 CV 的很多方面,現在很多圖像處理的庫大都是基於opencv庫開發的。但是opencv有一個致命缺陷,就是不可微分,所以就又出現了一種新型開源可微分計算機視覺庫 Kornia,建立在 PyTorch 之上。感興趣的小夥伴可以去github上看一下這個開源項目https://github.com/arraiyopensource/kornia
我們先簡單看一下opencv庫處理圖像的一些基礎操作吧

圖片讀取

opencv庫是一個跨平臺的庫,你可以用你擅長的語言去調用它,文章我用python,只需要調用cv2模塊就行
python安裝opencv模塊很簡單,一行命令就可以了

pip install opencv-python

利用cv2模塊讀取圖片時一定要注意路徑不能有中文,不然會讀不出來
在這裏插入圖片描述
先看一下cv2讀取這張圖片後的結果吧

import cv2
img= cv2.imread("data.jpg")
print(img)
#output
[[[238 239 243]
  [239 240 244]
  [240 241 245]
  ...
  [247 247 247]
  [247 247 247]
  [247 247 247]]
    ...
  [238 224 206]
  [238 224 206]
  [241 228 212]]]

我們都知道圖片都是由像素點組成的,每個像素點都有RGB這三個顏色值組成,所以讀取的圖片返回是一個類似於上面的三維數組。
這裏我再解釋一下imread()函數吧,這個函數原型是

imread(filename,flags)

後面的flags參數是個讀取標記,用於選擇讀取圖片的方式,默認值爲IMREAD_COLOR,意識就是讀取的圖像一定要是3通道BGR彩色圖像。flag值的設定與用什麼顏色格式讀取圖片有關,至於有多少模式可以選擇大家自己網上看一下opencv的資料就知道了,這裏我不再介紹了。

圖片灰度化

因爲圖片是三維的,每張圖片的數據量就會很大,不方便處理,所以常常會轉爲灰度圖做處理。什麼是灰度圖呢,就是在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值,這樣得到的灰度圖的每個像素點就只需要一個字節,不但節省了存儲空間還方便處理。

import cv2
img= cv2.imread("1.jpg")
print(img)
img_gray = cv2.cvtColor(img, code=cv2.COLOR_BGR2GRAY)
print(img_gray) 
cv2.imshow('gray', img_gray)
# 等待鍵盤輸入時中斷,單位是毫秒,如果是0,無限等待,不然程序執行到show時,會發生肉眼看不見圖片的現象
cv2.waitKey(0)
#output
[[240 241 242 ... 247 247 247]
 [240 241 242 ... 247 247 247]
 [240 241 242 ... 247 247 247]
 ...
 [204 204 204 ... 225 220 219]
 [204 204 204 ... 222 218 219]
 [200 200 200 ... 220 220 225]]

在這裏插入圖片描述
我們可以看到,轉爲灰度的圖片像素就變成二維的了

人臉識別

人臉識別是基於人的臉部信息特徵進行身份識別的生物識別技術,也是當前很熱門的一項計算機視覺研究領域。人臉識別需要大量數據進行訓練,我們暫時先用安裝cv2模塊裏已經訓練好的數據集來測試吧,網上說haarcascade_frontalface_alt.xml這個數據集準確率比較高,爲了方便使用,我們直接把這個數據集複製到工程同級目錄

這裏要注意一下,模塊裏的人臉檢測目前只能檢測正臉,並且圖片必須是正的,就是圖片上的人不能歪着頭,不然就檢測不到了,比如文章上面的那張圖片就檢測不到人臉

先看一下完整的代碼

import cv2

img = cv2.imread('data.jpg')
# 人臉數據,級聯分類器,給人臉特徵數據,返回可以識別人臉的對象
detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
# 轉換成灰度
gray = cv2.cvtColor(img, code=cv2.COLOR_BGR2GRAY)
# 使用訓練好的識別人臉對象來識別人臉區域
# 後兩個參數就是默認值,可以修改來調整識別人臉的精確度
face_zone = detector.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3) 

for x, y, w, h in face_zone:
    # 在人臉上畫一個正方形,畫正方形只需要知道左上角和右下角座標即可
    cv2.rectangle(img, pt1=(x, y), pt2=(x+w, y+h), color=[0, 255, 0], thickness=2)

# 使用灰度圖檢測,繪製在彩色圖片上
cv2.imshow('img', img)
cv2.waitKey(0)

這裏主要給大家解釋一下detectMultiScale()函數,這個函數原型是這樣的:

    def detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)

image:這裏一般是轉換成灰度後的圖片

scaleFactor:補償參數,一般設置值爲1.1-1.5比較好,效果大家自己改着看

minNeighbors:對當前其周圍有多少物體進行定義

minSize:設定窗口大小

flags:略抽象,選擇默認或者上圖即可
廢話不多說先給大家看一下效果

在這裏插入圖片描述
在這裏插入圖片描述
我們再來試試多人的圖片識別效果

在這裏插入圖片描述
在這裏插入圖片描述
畢竟不是自己訓練的數據集,所以結果差點意思,哈哈!!!不要在意細節
我們再試試人和動物能不能區分開
在這裏插入圖片描述
在這裏插入圖片描述
還是能區分開人臉和動物臉的,哈哈哈!!!

視頻處理

視頻本來就是由很多張圖片組成的,就好比圖片是由像素點構成的,兩者是同樣道理,只不過視頻有音頻加入,這裏我們就先不說視頻裏的音頻怎麼處理,因爲我也不會啊!!!
先看一下整體代碼吧

import cv2

# 讀取本地視頻
cap = cv2.VideoCapture("data.mp4")

w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + 1  # 寬一點沒問題,小了不行
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) + 1
vidioWriter = cv2.VideoWriter('data2.mp4', cv2.VideoWriter_fourcc('M','P','4','v'), 24, (w, h))  # 要求int型

detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')

while cap.isOpened():
    flag, frame = cap.read()

    gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
    face_zone = detector.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3)
    for x, y, w, h in face_zone:
        # 在人臉上畫一個正方形,畫正方形只需要知道左上角和右下角座標即可
        cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 255, 0], thickness=2)
        #  上面創建了寫視頻對象,僅需把每一幀寫入即可
        vidioWriter.write(frame)


    if flag == False:
        # 判斷是否還能讀取到幀,取不到則表示視頻結束了,退出循環
        break

    cv2.imshow('frame', frame)

    cv2.waitKey(20)

VideoWriter()函數
打開視頻文件或攝像頭視頻需要使用Opencv中的VideoCapture類,保存視頻或攝像頭視頻到本地磁盤,需要使用Opencv中的VideoWriter類,一般構造方式如下

VideoWriter(filename, fourcc, fps,frameSize, isColor=true);

filename: 是保存到本地後的視頻的文件名
fourcc:表示用那種編碼器,常用的有以下幾種:

CV_FOURCC('P','I','M','1') = MPEG-1 codec
CV_FOURCC('M','J','P','G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

其中CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) 這種方式是佔用空間最小的
fps:幀率,通常都會使用20-30
frameSize:每張圖片的大小,以元組方式傳參(w, h)
read( )函數
flag, frame = cap.read()

flag和frame接收返回值,flag是個布爾型值,表示是否讀取到幀,frame爲當前幀的數據
上面這兩個函數理解了,那麼視頻中的人臉識別就好理解了,就是獲取每一幀的圖片然後利用人臉檢測標註畫個方框,然後我每一幀之間有個20ms等待時間,這樣合起來就是一個視頻,來看看我們的輸出結果

在這裏插入圖片描述
好像還是有點小誤差哈,這篇文章裏面視頻處理其實就是分解爲圖片的進行處理。
至於圖像及視頻處理的原理及算法等後面我學會了再分享給大家,有興趣的小夥伴也可以一起交流一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章