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