三十行代碼實現自動戴口罩

自1月20日鍾南山院士肯定此次新型肺炎存在着人傳人的現象起,到今日的武漢封城,我們人民羣衆也需要提高對此次疫情的重視程度,做好自身的防範工作,平平安安,過個好年。

儘量少去人羣密集的場所,如果非要出門一定要戴上口罩,勤用肥皂和清水或含有酒精的洗手液洗手也是非常有必要的。

在網絡世界中,我們可以通過給頭像戴口罩,來呼籲廣大羣衆積極保護自身安全。在這裏,我們運用Python簡單的幾十行代碼來實現在社交網絡中也給自己的頭像自動戴上口罩。

大致的效果如下:

file

用到的技術主要有人臉識別(當然,調用了接口)、openCV圖像處理這兩項。

人臉識別

曠視提供了人臉識別的API,輸入圖片便可以得到人臉的各個稠密關鍵點的所在位置,通俗來講,就是勾畫出五官。

file

我們通過使用其嘴巴的位置數據,可以定位口罩的佩戴位置。並通過計算人臉嘴巴的大小,自動調整口罩的大小進行適配。

def get_mouth(dst_pic):
    with open(dst_pic, 'rb') as f:
        base64_data = base64.b64encode(f.read())
    url='https://api-cn.faceplusplus.com/facepp/v1/face/thousandlandmark'
    headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}
    data={
             # api_key,api_secret需自己申請
          'api_key':'',
          'api_secret':'',
          'return_landmark': 'mouth',
          'image_base64': base64_data
                         }
    r=requests.post(url,headers=headers,data=data)
    mouth=r.json()['face']['landmark']['mouth']
    x,y=[],[]
    for i in mouth.values():
        y.append(i['y'])
        x.append(i['x'])
    y_max=max(y)
    y_min=min(y)
    x_max=max(x)
    x_min=min(x)
    middle_x=int((x_max x_min)/2)
    middle_y=int((y_max y_min)/2)
    size=(int(3*(x_max-x_min)),int(5*(y_max-y_min)))
    return (middle_x,middle_y),size

圖像處理

有了口罩的估計大小,可以自動更改口罩的圖像大小,根據計算得到的口罩的中心位置來擺放口罩,並通過簡單的掩膜處理,利用seamlessClone函數將口罩照片添加到頭像圖片上。

def add_mask(img_path,img_outPath):
    src_pic="/root/Documents/abc.jpg"
    center,size=get_mouth(img_path)
    src=cv2.imread(src_pic)
    src=cv2.resize(src,size)
    dst=cv2.imread(img_path)
    # 掩膜mask
    mask=255*np.ones(src.shape, src.dtype)
    output=cv2.seamlessClone(src, dst, mask, center, cv2.NORMAL_CLONE)
    cv2.imwrite(img_outPath, output)

當然,這只是一個小demo, 有許多地方可以改進,例如我們可以根據鼻樑的傾斜程度判斷人臉的傾斜程度,從而對口罩做相應的旋轉操作,更加適配人臉。

發佈了136 篇原創文章 · 獲贊 492 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章