最近在嘗試做一個(gè)人臉識(shí)別項(xiàng)目,在對(duì)比幾款主流人臉識(shí)別SDK后,采用了虹軟的Arcface SDK,因?yàn)樗峁┝嗣赓M(fèi)版本,并且可以離線(xiàn)使用,接入難度也比較低。項(xiàng)目中有一個(gè)需求就是顯示檢測(cè)到的人臉,但是如何從一張圖片中摳取合適大小的人臉呢?本文將從以下步驟來(lái)介紹如何實(shí)現(xiàn):
創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比隆林網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式隆林網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋隆林地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴(lài)。
1. 如何獲得人臉框
2. 如何根據(jù)人臉框裁剪
3. 如何進(jìn)行結(jié)果圖旋轉(zhuǎn)
4. 應(yīng)用場(chǎng)景舉例
首先我們來(lái)看一下虹軟Android ArcFace SDK用于人臉檢測(cè)的detectFaces函數(shù)以及人臉數(shù)據(jù)類(lèi)FaceInfo:
detectFaces函數(shù):
參數(shù) | 類(lèi)型 | 說(shuō)明 |
---|---|---|
data | byte[] | 圖像數(shù)據(jù)的內(nèi)存 |
width | int | 圖像的寬 |
height | int | 圖像的高 |
format | int | 圖像的格式 |
faceInfoList | List
| 人臉檢測(cè)結(jié)果列表 |
FaceInfo定義:
參數(shù) | 類(lèi)型 | 說(shuō)明 |
---|---|---|
rect | Rect | 人臉在圖像中的坐標(biāo) |
orient | int | 人臉的朝向 |
faceId | int | 人臉id,用于標(biāo)識(shí)人臉 |
人臉檢測(cè)函數(shù)介紹的文章有很多,這里就不多做介紹了。FaceInfo中的rect就是我們用來(lái)?yè)溉∪四樀闹匾獏?shù),下圖就是根據(jù)它畫(huà)出的人臉框。
以Android平臺(tái)為例,Bitmap類(lèi)提供了函數(shù) createBitmap(Bitmap source, int x, int y, int width, int height)
參數(shù) | 類(lèi)型 | 說(shuō)明 |
---|---|---|
source | Bitmap | 原始圖像 |
x | int | 人臉框左上角y坐標(biāo) |
y | int | 人臉框左上角y坐標(biāo) |
width | int | 新圖像的寬 |
height | int | 新圖像的高 |
使用這個(gè)函數(shù)就可以摳取任意區(qū)域內(nèi)圖像內(nèi)容:
//原圖
Bitmap source;
//人臉框
Rect faceRect;
//創(chuàng)建Bitmap
Bitmap.createBitmap(source,faceRect.left,faceRect.top,faceRect.width(),faceRect.height();
FaceInfo中orient代表這個(gè)人臉在圖像中的朝向,當(dāng)其不為0°的時(shí)候,需要根據(jù)實(shí)際情況進(jìn)行旋轉(zhuǎn)。
旋轉(zhuǎn)角度 | 類(lèi)型 | 說(shuō)明 |
---|---|---|
ASF_OC_0 | int | 0° |
ASF_OC_90 | int | 逆時(shí)針90° |
ASF_OC_180 | int | 180° |
ASF_OC_270 | int | 順時(shí)針90° |
以下是旋轉(zhuǎn)代碼
//原圖
Bitmap source;
//人臉框
Rect faceRect;
//創(chuàng)建Bitmap,假設(shè)需要順時(shí)針旋轉(zhuǎn)90°
Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap.createBitmap(source, faceRect.left, faceRect.top, faceRect.width(),
faceRect.height(), matrix, true);
例如門(mén)禁場(chǎng)景下,需要顯示人臉(摳圖)或者上傳人臉圖片到服務(wù)端。如果上傳完整的圖像,則會(huì)占用大量的存儲(chǔ)空間以及網(wǎng)絡(luò)資源,所以上傳摳取的人臉圖片是比較合適的,但是根據(jù)檢測(cè)所得的人臉框摳取的人臉是不完整的,所以需要對(duì)人臉框做一些后期處理,最簡(jiǎn)單的方案就是寬高分別向外擴(kuò)大其1/2長(zhǎng)度。示例代碼如下:
//原圖
Bitmap source;
//人臉框
Rect faceRect;
//調(diào)整人臉框
Rect newRect = new Rect(faceRect);
//確保人臉框在圖像內(nèi)
if (newRect.left < 0) {
newRect.left = 0;
}
if (newRect.top < 0) {
newRect.top = 0;
}
if (newRect.right > source.getWidth()) {
newRect.right =
source.getWidth();
}
if (newRect.bottom > source.getHeight()) {
newRect.bottom =
source.getHeight();
}
//
int offsetX = Math.min(Math.min(faceRect.width()/2,newRect.left),
source.getWidth() - newRect.right);
int offsetY = Math.min(Math.min(faceRect.height()/2,newRect.top),
source.getHeight() - newRect.bottom);
newRect.inset(-offsetX, -offsetY);
//創(chuàng)建Bitmap,假設(shè)需要順時(shí)針旋轉(zhuǎn)90°
Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap.createBitmap(source, newRect.left, newRect.top, newRect.width(),
newRect.height(), matrix, true);
虹軟人臉識(shí)別Android Demo中提供了很多人臉識(shí)別相關(guān)功能,如:畫(huà)人臉框適配的方案;異步人臉特征提取;異步人臉特征比對(duì)等等,有需要可以在下面鏈接下載:
Android Demo可在
虹軟人臉識(shí)別開(kāi)放平臺(tái)下載
本文名稱(chēng):人臉框摳圖如何實(shí)現(xiàn)
分享地址:http://chinadenli.net/article0/ppceio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、App開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)公司、關(guān)鍵詞優(yōu)化、軟件開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)