用Python進行人臉識別(四)

2021-09-19 09:09:53 字數 3853 閱讀 5318

上一節已經成功的安裝 opnecv庫,這節介紹一下opnecv的基本用法。

對進行讀取、複製、儲存,在設計中需要提取進行分類的訓練,或者呼叫庫對進行識別處理,以及人臉註冊時需要儲存相對應人物的。

import cv2

import numpy as np

from pil import image, imagedraw, imagefont

#pil(python imaging library)是python內建的影象處理標準庫

img = cv2.imread('test.jpg')#讀取

cv2.imshow('test',img) #顯示

new_img = img.copy() #拷貝

#儲存 第乙個引數為儲存的名稱 第二個引數為要儲存的

#儲存 第三個引數是的清晰度引數

#cv2.imwrite_jpeg_quality 設定jpg格式0-100的值域 數字越高畫質晰度越好 預設95

#cv2.imwrite_png_compression設定png 值域0-9 預設3 數字越高畫質晰度越差

在人臉識別中,經常需要將原圖轉化為灰度圖。因為識別人臉是根據特徵法來的,而此方法不通過色彩進行。而將有色圖轉化為灰度圖,降低了的複雜度,可以減少識別需要的時間。

gary_image = cv2.cvtcolor(img, cv2.color_rgb2gray)  

#轉化為灰度圖 第一引數為原圖 第二個引數命令rgb to gary 轉化為灰度

cv2.imshow('gary', gary_image)

gary_image[...] = 0 #轉化為黑色的 三個色度都為0

cv2.imshow('black', gary_image)

cv2.waitkey(0)

在處理時,將先縮小,處理完成後再進行放大,可以極大的提高工作效率。因為縮小後,所含的陣列量會相應的縮小,相當於陣列規模的減小,計算量就減少。

print(img.shape)  

#返回的的尺寸(行,列)及維數 3表示rgb 即有色圖

print(gary_image.shape)

#返回尺寸 沒有維度 預設為灰度圖 維度為2

#改變的大小

change_img = cv2.resize(img, (0,0), fx=0.5, fy=0.5)

#第乙個引數為改變的 第二個引數如果為(0,0)

#則第三 第四個引數為原橫、縱長度的倍數

#fx=0.5 即新的橫座標為原的0.5倍 fy同理

#0.5*0.5=0.25 新為原的四分之一大小

cv2.imshow('change_img', change_img)

change_img1 = cv2.resize(img, (0,0), fx=1.5, fy=1.2)

#第五個引數為差值方法 共有五種 此處採用預設 有興趣的可以自行了解

#橫為原來的1.5倍 縱為原來的1.2倍

cv2.imshow('change_img1', change_img1)

change_img2 = cv2.resize(img, (400,500), interpolation=cv2.inter_cubic)

#若第二個引數不為(0,0) 則大小變為第二個引數所設定的值 此處為(400,500) 與原的大小無關

#此處的第三個引數為差值方法 可預設 也可自行設定

cv2.imshow('change_image2', change_img2)

cv2.waitkey(0)

opencv支援在上畫圓、矩形等圖案。在人臉識別中,經常用圓或者矩形來標識人臉的區域,檢測系統的執行效果。同時,利用opencv還可以在上輸入字串,但是opencv沒有內建輸入漢字功能,但使用pil庫輔助opencv,編寫相對應的函式,就可以實現顯示漢字的功能。

#定義顯示中文的函式  注意呼叫本文開頭的那三個庫

def change_cv2_draw(image, strs, local, size, color):

''' 在上顯示漢字 輸入為 ,漢字字元,左上角座標, 字型大小, 字型顏色

返回處理後的'''

cv2img = cv2.cvtcolor(image, cv2.color_bgr2rgb)

pilimg = image.fromarray(cv2img)

draw = imagedraw.draw(pilimg)

font = imagefont.truetype("simhei.ttf", size, encoding="utf-8")

draw.text(local, strs, color, font=font)

image = cv2.cvtcolor(np.array(pilimg), cv2.color_rgb2bgr)

return image

cv2.rectangle(img, (0,0), (100,100), (0,0,255), 2)

#現在顏色的編碼模式為 bgr (0,0,255)為紅色

#手冊上說第乙個引數為 第二個參設矩陣左上角座標 第三個引數為矩陣右下角座標

#第四位矩陣顏色 第五位矩陣線寬大小

#實際操作發現 第二 第三個引數只要是矩陣的兩個對角就可以

cv2.puttext(img, 'test', (50,50), cv2.font_hershey_duplex, 1.0, (255,0,0), 2)

#引數為 、待顯示字串、左上角座標、字型格式、字型大小、字型顏色、字型的粗細

#網上說第三個引數為左上角 但我總感覺是左下角 不需要太精確的顯示就無所謂

img = change_cv2_draw(img, '文字', (100,200), 50, (0,255,0))

#呼叫上面的函式 顯示漢字

cv2.imshow('change', img)

cv2.waitkey(0)

實時進行處理,一定需要用到攝像頭,好在opencv可以直接呼叫電腦自身的攝像頭,可以呼叫外設攝像頭。

cap = cv2.videocapture(0)  

#呼叫攝像頭 編號0代表計算自身的攝像頭

while true: #不停的重新整理 實時顯示攝像頭

ret,image = cap.read()

#ret為true或flase 表示是否讀取到

#image為當前一幀的

cv2.imshow('cap',image)

#如果案件按下且為字母q 則退出迴圈

#waitkey上一節已將將了 選擇重新整理的時間為1ms

if cv2.waitkey(1) & 0xff == ord('q'):

break

cap.release() #釋放攝像頭

cv2.destroyallwindows() #關閉所有視窗

一定要有最後的if語句,否則一幀一幀之間沒有間隔緩衝,所造成的效果就是灰屏。計算器顯示也需要一定的時間,幀與幀之間必須留有一定的時間。當然,如果時間太長最終的結果會呈現卡頓。同理,在後期需要對進行對應處理的時候,也要留有一定的時間來保證處理完成。否則,程式會直接卡死,因為邏輯沒問題,但是物理實現需要一定時間。

這些只是opencv功能中的冰山一角,不過足夠本次設計的使用了。

用Python進行人臉識別(二)

安裝anaconda 安裝pycharm pycharm是python ide,而anaconda是乙個基於python的環境管理工具。python有著強大的庫資源 標準庫和第三方庫 利用這些庫可以在不同的領域程式設計開發,而且語法較為簡單 易懂。python有這麼多庫,不同的庫又有不同的版本,那怎...

用python進行人臉識別(三)

由於anaconda3自帶的python包是py37,開發過程中有個包一直出錯,好長時間都沒有解決,直接換成py36。需要新建py36的虛擬環境,其他版本的python操作類似。當然,你也可以直接使用py37。我只是為了更快的完成,方便查詢資料才切換成py36.首先按下win r,輸入cmd開啟命令...

用Python進行人臉識別(五)

opencv的基本操作已經學會了,那麼開始嘗試進行人臉識別吧。人類區分不同的人臉是根據鼻子 醉 眼睛 眉毛 膚色等等因素,這些因素的大小 間距 形狀的不同,構成了形形色色的人臉,也構成了這個大千世界。人臉識別的前期就是按照這個思路進行,即幾何特徵法。但後來發現這玩應兒並不好用,發展出了許許多多的識別...