溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

人臉框摳圖如何實(shí)現(xiàn)

發(fā)布時(shí)間:2020-08-10 15:49:51 來源:ITPUB博客 閱讀:154 作者:丸子丸子丸子 欄目:互聯(lián)網(wǎng)科技

最近在嘗試做一個人臉識別項(xiàng)目,在對比幾款主流人臉識別SDK后,采用了虹軟的Arcface SDK,因?yàn)樗峁┝嗣赓M(fèi)版本,并且可以離線使用,接入難度也比較低。項(xiàng)目中有一個需求就是顯示檢測到的人臉,但是如何從一張圖片中摳取合適大小的人臉呢?本文將從以下步驟來介紹如何實(shí)現(xiàn):

1. 如何獲得人臉框
2. 如何根據(jù)人臉框裁剪
3. 如何進(jìn)行結(jié)果圖旋轉(zhuǎn)
4. 應(yīng)用場景舉例

1. 如何獲得人臉框

首先我們來看一下虹軟Android ArcFace SDK用于人臉檢測的detectFaces函數(shù)以及人臉數(shù)據(jù)類FaceInfo:
detectFaces函數(shù):

參數(shù) 類型 說明
data byte[] 圖像數(shù)據(jù)的內(nèi)存
width int 圖像的寬
height int 圖像的高
format int 圖像的格式
faceInfoList List 人臉檢測結(jié)果列表

FaceInfo定義:

參數(shù) 類型 說明
rect Rect 人臉在圖像中的坐標(biāo)
orient int 人臉的朝向
faceId int 人臉id,用于標(biāo)識人臉

人臉檢測函數(shù)介紹的文章有很多,這里就不多做介紹了。FaceInfo中的rect就是我們用來摳取人臉的重要參數(shù),下圖就是根據(jù)它畫出的人臉框。
人臉框摳圖如何實(shí)現(xiàn)

2. 如何根據(jù)人臉框裁剪

以Android平臺為例,Bitmap類提供了函數(shù) createBitmap(Bitmap source, int x, int y, int width, int height)

參數(shù) 類型 說明
source Bitmap 原始圖像
x int 人臉框左上角y坐標(biāo)
y int 人臉框左上角y坐標(biāo)
width int 新圖像的寬
height int 新圖像的高

使用這個函數(shù)就可以摳取任意區(qū)域內(nèi)圖像內(nèi)容:

//原圖
Bitmap source;
//人臉框
Rect faceRect;
//創(chuàng)建Bitmap
Bitmap.createBitmap(source,faceRect.left,faceRect.top,faceRect.width(),faceRect.height();

人臉框摳圖如何實(shí)現(xiàn)
人臉框摳圖如何實(shí)現(xiàn)

3. 如何進(jìn)行結(jié)果圖旋轉(zhuǎn)

FaceInfo中orient代表這個人臉在圖像中的朝向,當(dāng)其不為0°的時(shí)候,需要根據(jù)實(shí)際情況進(jìn)行旋轉(zhuǎn)。

旋轉(zhuǎn)角度 類型 說明
ASF_OC_0 int
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);

4. 應(yīng)用場景舉例

例如門禁場景下,需要顯示人臉(摳圖)或者上傳人臉圖片到服務(wù)端。如果上傳完整的圖像,則會占用大量的存儲空間以及網(wǎng)絡(luò)資源,所以上傳摳取的人臉圖片是比較合適的,但是根據(jù)檢測所得的人臉框摳取的人臉是不完整的,所以需要對人臉框做一些后期處理,最簡單的方案就是寬高分別向外擴(kuò)大其1/2長度。示例代碼如下:

//原圖
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í)現(xiàn)

溫馨提示:

虹軟人臉識別Android Demo中提供了很多人臉識別相關(guān)功能,如:畫人臉框適配的方案;異步人臉特征提取;異步人臉特征比對等等,有需要可以在下面鏈接下載:
Android Demo可在 虹軟人臉識別開放平臺下載

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI