公司成立于2021年,是全球范圍內(nèi)少數(shù)同時(shí)擁有全棧3D AIGC技術(shù)和自然語言生成式大模型技術(shù)的前沿人工智能公司。
136?2108?0965
136 2108 0965
1039900924
1039900924@qq.com
Windows
入門的時(shí)候配置環(huán)境總是一個(gè)非常麻煩的事情,在Windows上配置OpenC更是如此。
既然寫了這個(gè)推廣的科普教程,總不能讓讀者卡在環(huán)境配置上吧。
下面用到的文件都可以在 這里 (提取碼:b6ec)下載,但是注意,。
將cv2加入sitepackages
將下載下來的 文件放入Python安裝的文件夾下的 Libsitepackages 目錄。
就我的電腦而言,這個(gè)目錄就是 C:PythonLibsitepackages 。
記得不要直接使用pip安裝,將文件拖過去即可。
安裝numpy組件
在命令行下進(jìn)入到下載下來的文件所在的目錄(按住Shift右鍵有在該目錄開命令行的選項(xiàng))
鍵入命令:
如果你的系統(tǒng)或者Python不適配,可以在 這里 下載別的輪子。
測(cè)試OpenC安裝
在命令行鍵入命令:
python c "import cv2"
如果沒有出現(xiàn)錯(cuò)誤提示,那么cv2就已經(jīng)安裝好了。
OpenC的人臉檢測(cè)應(yīng)用
人臉檢測(cè)應(yīng)用,簡(jiǎn)而言之就是一個(gè)在照片里找到人臉,然后用方框框起來的過程(我們的相機(jī)經(jīng)常做這件事情)
那么具體而言就是這樣一個(gè)過程:
獲取攝像頭的圖片
在圖片中檢測(cè)到人臉的區(qū)域
在人臉的區(qū)域周圍繪制方框
獲取攝像頭的圖片
這里簡(jiǎn)單的講解一下OpenC的基本操作。
以下操作是開攝像頭的基本操作:
#coding=utf8
importcv2
# 一般筆記本的默認(rèn)攝像頭都是0
capInput = (0)
# 我們可以用這條命令檢測(cè)攝像頭是否可以讀取數(shù)據(jù)
if not (): print('Capture failed because of camera')
那么怎么從攝像頭讀取數(shù)據(jù)呢?
# 接上段程序
# 現(xiàn)在攝像頭已經(jīng)開了,我們可以使用這條命令讀取圖像
# img就是我們讀取到的圖像,就和我們使用open('', 'rb').read()讀取到的數(shù)據(jù)是一樣的
ret, img = ()
# 你可以使用open的方式存儲(chǔ),也可以使用cv2提供的方式存儲(chǔ)
('', img)
# 同樣,你可以使用open的方式讀取,也可以使用cv2提供的方式讀取
img = ('')
為了方便顯示圖片,cv2也提供了顯示圖片的方法:
# 接上段程序
# 定義一個(gè)窗口,當(dāng)然也可以不定義
imgWindowName = 'ImageCaptured'
imgWindow = (imgWindowName, )
# 在窗口中顯示圖片
(imgWindowName, img)
當(dāng)然在完成所有操作以后需要把攝像頭和窗口都做一個(gè)釋放:
# 接上段程序
# 釋放攝像頭
()
# 釋放所有窗口
()
在圖片中檢測(cè)到人臉的區(qū)域
OpenC給我們提供了已經(jīng)訓(xùn)練好的人臉的xml模板,我們只需要載入然后比對(duì)即可。
# 接上段程序
# 載入xml模板
faceCascade = ('')
# 將圖形存儲(chǔ)的方式進(jìn)行轉(zhuǎn)換
gray = (img, )
# 使用模板匹配圖形
faces = (gray, , 5)
print(faces)
在人臉的區(qū)域周圍繪制方框
在上一個(gè)步驟中,faces中的四個(gè)量分別為左上角的橫坐標(biāo)、縱坐標(biāo)、寬度、長度。
所以我們根據(jù)這四個(gè)量很容易的就可以繪制出方框。
# 接上段程序
# 函數(shù)的參數(shù)分別為:圖像,左上角坐標(biāo),右下角坐標(biāo),顏色,寬度
img = (img, (x, y), (x w, y h), (), 2)
成果
根據(jù)上面講述的內(nèi)容,我們現(xiàn)在已經(jīng)可以完成一個(gè)簡(jiǎn)單的人臉辨認(rèn)了:
#coding=utf8
importcv2
print('Press Esc to exit')
faceCascade = ('')
imgWindow = ('FaceDetect', )
defdetect_face():
capInput = (0)
# 避免處理時(shí)間過長造成畫面卡頓
nextCaptureTime = ()
faces = []
if not (): print('Capture failed because of camera')
while 1:
ret, img = ()
gray = (img, )
if nextCaptureTime
使用Face完成人臉辨識(shí)
第一次認(rèn)識(shí)Face還是因?yàn)橹Ц秾毜娜四樦Ц?,響?yīng)速度還是非常讓人滿意的。
現(xiàn)在只需要免費(fèi)注冊(cè)一個(gè)賬然后新建一個(gè)應(yīng)用就可以使用了,非常方便。
他的方是 這個(gè) ,注冊(cè)好之后在 這里 的我的應(yīng)用中創(chuàng)建應(yīng)用即可。
創(chuàng)建好應(yīng)用之后你會(huì)獲得API Key與API Secret。
Face的API調(diào)用邏輯簡(jiǎn)單來說是這樣的:
上傳圖片獲取讀取到的人的face_id
創(chuàng)建Pern,獲取pern_id(Pern中的圖片可以增加、刪除)
比較兩個(gè)face_id,判斷是否是一個(gè)人
比較face_id與pern_id,判斷是否是一個(gè)人
上傳圖片獲取face_id
在將圖片通過post方法上傳到特定的地址后將返回一個(gè)jn的值。
如果api_key, api_secret沒有問題,且在上傳的圖片中有識(shí)別到人臉,那么會(huì)存儲(chǔ)在jn的face鍵值下。
#coding=utf8
importrequests
# 這里填寫你的應(yīng)用的API Key與API Secret
API_KEY = ''
API_SECRET = ''
# 目前的API是這個(gè),你可以在API文檔里找到這些
BASE_URL = '
# 使用Requests上傳圖片
url = '%s/detection/detect?api_key=%s
創(chuàng)建Pern
這個(gè)操作沒有什么可以講的內(nèi)容,可以對(duì)照這段程序和方的API介紹。
方的API介紹可以見 這里 ,相信看完這一段程序以后你就可以自己完成其余的API了。
# 上接上一段程序
# 讀取face_id
if not facesis None: faceIdList = [face['face_id'] for facein faces]
# 使用Requests創(chuàng)建Pern
url = '%s/pern/create'%BASE_URL
params = {
'api_key': API_KEY,
'api_secret': API_SECRET,
'pern_name': 'LittleCoder',
'face_id': ','.join(faceIdList), }
r = (url, params = params)
# 獲取pern_id
print .()['pern_id']
進(jìn)度確認(rèn)
到目前為止,你應(yīng)該已經(jīng)可以就給定的兩張圖片比對(duì)是否是同一個(gè)人了。
那么讓我們來試著寫一下這個(gè)程序吧,兩張圖片分別為’’, ‘’好了。
下面我給出了我的代碼:
defupload_img(fileDir, oneface = True):
url = '%s/detection/detect?api_key=%s
成品
到此,所有的知識(shí)介紹都結(jié)束了,相比大致如何完成這個(gè)項(xiàng)目各位讀者也已經(jīng)有想法了吧。
要調(diào)用api接口,建議用face的,支付寶的人臉識(shí)別都是用的這個(gè)。可能需要一點(diǎn)費(fèi)用,不貴,代碼里把fece的api接口放進(jìn)代碼就行,還可以可以檢測(cè)情緒,年齡等等的。
當(dāng)然也有其他人臉識(shí)別的api接口,自己發(fā)現(xiàn)吧,其實(shí)很多,但基本都不會(huì)免費(fèi),有的可以試用
,加入了新的類facerecognizer,我們可以使用它便捷地進(jìn)行人臉識(shí)別實(shí)驗(yàn)。本文既介紹代碼使用,又介紹算法原理。(他寫的源代碼,我們可以在opencv的opencv\modules\contrib\doc\facerec\src下找到,當(dāng)然也可以在他的github中找到,如果你想研究源碼,自然可以去看看,不復(fù)雜)
目前支持的算法有
eigenfaces特征臉createeigenfacerecognizer()
fisherfaces createfisherfacerecognizer()
localbinary patterns histograms局部二值直方圖 createlbphfacerecognizer()
下面所有的例子中的代碼在opencv安裝目錄下的samples/cpp下面都能找到,所有的代碼商用或者學(xué)習(xí)都是免費(fèi)的。
recognition
對(duì)人類來說,人臉識(shí)別很容易。文獻(xiàn)[tu]中有描述。一個(gè)維的特征向量被用在一個(gè)大數(shù)據(jù)庫上,單靠幾何特征不能提供足夠的信息用于人臉識(shí)別。
特征臉方法在文獻(xiàn)[tp]。其中一個(gè)基本的想法就是,使類內(nèi)方差最小的同時(shí),使類外方差最大。
近年來,各種局部特征提取方法出現(xiàn)。為了避免輸入的圖像的高維數(shù)據(jù),僅僅使用的局部特征描述圖像的方法被提出,提取的特征(很有希望的)對(duì)于局部遮擋、光照變化、小樣本等情況更強(qiáng)健。有關(guān)局部特征提取的方法有蓋伯小波(gabor waelets)([wiskott])。使用什么方法來提取時(shí)域空間的局部特征依舊是一個(gè)開放性的研究問題,因?yàn)榭臻g信息是潛在有用的信息。
database
我們先獲取一些數(shù)據(jù)來進(jìn)行實(shí)驗(yàn)吧。我不想在這里做一個(gè)幼稚的例子。我們?cè)谘芯咳四樧R(shí)別,所以我們需要一個(gè)真的人臉圖像!你可以自己創(chuàng)建自己的數(shù)據(jù)集,也可以從這里(下載一個(gè)。
at&tfacedatabase又稱orl人臉數(shù)據(jù)庫,個(gè)人,每人張照片。照片在不同時(shí)間、不同光照、不同表情(睜眼閉眼、笑或者不笑)、不同人臉細(xì)節(jié)(戴眼鏡或者不戴眼鏡)下采集。所有的圖像都在一個(gè)黑暗均勻的背景下采集的,正面豎直人臉(有些有有輕旋轉(zhuǎn))。
可以使用OpenC,OpenC的人臉檢測(cè)功能在一般場(chǎng)合還是不錯(cuò)的。而ubuntu正好提供了pythonopencv這個(gè)包,用它可以方便地實(shí)現(xiàn)人臉檢測(cè)的代碼。
寫代碼之前應(yīng)該先安裝pythonopencv:
#!/usr/bin/python
#?*?coding:?UTF8?*
#?
#?Face?Detection?using?OpenC.?Based?on?sample?code?from:
#?
#?Usage:?python
import?sys,?os
fromimport?*
fromimport?*
from?PIL?import?Image,?ImageDraw
from?math?import?sqrt
def?detectObjects(image):
"""Converts?an?image?to?grayscale?and?prints?the?locations?of?any?faces?found"""
grayscale?=?cvCreateImage(cvSize(,?),?8,?1)
cvCvtColor(image,?grayscale,?C_BGR2GRAY)
storage?=?cvCreateMemStorage(0)
cvClearMemStorage(storage)
cvEqualizeHist(grayscale,?grayscale)
cascade?=?cvLoadHaarClassifierCascade(
'/usr/share/opencv/haarcascades/',
cvSize(1,1))
faces?=?cvHaarDetectObjects(grayscale,?cascade,?storage,?,?2,
C_HAAR_DO_CANNY_PRUNING,?cvSize())
result?=?[]
for?f?in?faces:
((,?,?,?))
return?result
def?grayscale(r,?g,?b):
return?int(r?*?.b?*?.)
def?process(infile,?outfile):
image?=?cvLoadImage(infile);
if?image:
faces?=?detectObjects(image)
im?=?(infile)
if?faces:
draw?=?(im)
for?f?in?faces:
(f,?outline=())
(outfile,?"JPEG",?quality=)
else:
print?"Error:?cannot?detect?faces?on?%s"?%?infile
if?__name__?==?"__main__":
process('',?'')
能啊,你在ai申請(qǐng)一個(gè)api賬,然后python編個(gè)程序調(diào)用api就可以了