最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實戰(zhàn)之基于OpenCV的美顏掛件制作

 更新時間:2021年11月18日 15:26:11   作者:盼小輝丶  
在本文中,我們將學(xué)習如何創(chuàng)建有趣的基于Snapchat的增強現(xiàn)實,主要包括兩個實戰(zhàn)項目:在檢測到的人臉上的鼻子和嘴巴之間添加胡子掛件,在檢測到的人臉上添加眼鏡掛件。感興趣的童鞋可以看看哦

基于 Snapchat 的增強現(xiàn)實

胡子掛件融合

第一個項目中,我們將在檢測到的臉上覆蓋了一個小胡子。我們可以使用從攝像頭捕獲的連續(xù)視頻幀,也可以使用單張測試圖像。在進行實際講解程序的關(guān)鍵步驟前,首先查看應(yīng)用程序預(yù)期輸出的結(jié)果圖像:


項目的第一步是檢測圖像中的人臉。如上圖所示,使用青色矩形繪制圖像中檢測到的人臉的位置和大?。唤酉聛淼鷪D像中所有檢測到的人臉,在其區(qū)域內(nèi)搜索鼻子,粉紅色矩形表示圖像中檢測到的鼻子;檢測到鼻子之后,就要根據(jù)之前計算出的鼻子的位置和大小來調(diào)整我們想要覆蓋“胡子”掛件的區(qū)域,藍色矩形表示計算獲得的胡須將被覆蓋的區(qū)域位置。如果處理的目標是連續(xù)視頻幀,在處理完成所有檢測到的人臉后,將繼續(xù)分析下一幀。

根據(jù)上述描述,程序應(yīng)當首先檢測圖像中的人臉和鼻子。為了檢測這些對象,創(chuàng)建了兩個分類器,一個用于檢測人臉,另一個用于檢測鼻子:

# 用于人臉和鼻子檢測的級聯(lián)分類器
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
nose_cascade = cv2.CascadeClassifier("haarcascade_mcs_nose.xml")

一旦創(chuàng)建了分類器,下一步就是使用 cv2.detectMultiScale() 函數(shù)檢測圖像中的這些對象。cv2.detectMultiScale() 函數(shù)檢測輸入灰度圖像中不同大小的對象,并將檢測到的對象作為矩形列表返回。例如,檢測人臉時使用以下代碼:

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

接下來,遍歷檢測到的人臉,嘗試檢測鼻子:

# 遍歷檢測到的人臉
for (x, y, w, h) in faces:
    # 根據(jù)檢測到的面大小創(chuàng)建感興趣區(qū)域(ROI)
    roi_gray = gray[y:y + h, x:x + w]
    roi_color = frame[y:y + h, x:x + w]

    # 在檢測到的人臉內(nèi)檢測鼻子
    noses = nose_cascade.detectMultiScale(roi_gray)

檢測到鼻子后,遍歷所有檢測到的鼻子,并計算將被“胡子”掛件覆蓋的區(qū)域。過濾掉錯誤的鼻子位置后,將“胡子”掛件根據(jù)先前計算的區(qū)域覆蓋在圖像上:

for (nx, ny, nw, nh) in noses:
    # 計算將被“胡子”掛件覆蓋的區(qū)域坐標
    x1 = int(nx - nw / 2)
    x2 = int(nx + nw / 2 + nw)
    y1 = int(ny + nh / 2 + nh / 8)
    y2 = int(ny + nh + nh / 4 + nh / 6)

    if x1 < 0 or x2 < 0 or x2 > w or y2 > h:
        continue

    # 計算將被“胡子”掛件覆蓋的區(qū)域尺寸
    img_moustache_res_width = int(x2 - x1)
    img_moustache_res_height = int(y2 - y1)

    # 調(diào)整掩膜大小,使其與放置“胡子”掛件的區(qū)域相等
    mask = cv2.resize(img_moustache_mask, (img_moustache_res_width, img_moustache_res_height))

    # 翻轉(zhuǎn)掩膜
    mask_inv = cv2.bitwise_not(mask)

    # 將“胡子”掛件調(diào)整為所需區(qū)域
    img = cv2.resize(img_moustache, (img_moustache_res_width, img_moustache_res_height))
    # 獲取原始圖像的ROI
    roi = roi_color[y1:y2, x1:x2]
    # 創(chuàng)建ROI背景和ROI前景
    roi_bakground = cv2.bitwise_and(roi, roi, mask=mask_inv)
    roi_foreground = cv2.bitwise_and(img, img, mask=mask)
    # 獲取結(jié)果
    res = cv2.add(roi_bakground, roi_foreground)
    # 將res置于原始圖像中
    roi_color[y1:y2, x1:x2] = res
    break

上述程序的關(guān)鍵在于 img_mustache_mask 圖像。此圖像是使用要融合的“胡子”圖像的 Alpha 通道創(chuàng)建的,使用此圖像,將可以只繪制疊加圖像的前景,基于融合圖像的 alpha 通道創(chuàng)建的“胡子”蒙版如下:

img_moustache = cv2.imread('moustache.png', -1)
img_moustache_mask = img_moustache[:, :, 3]
cv2.imshow("img moustache mask", img_moustache_mask)

獲得的胡子蒙版,如下所示:

增強現(xiàn)實融合“胡子”掛件后的結(jié)果如下所示:

這里不再針對視頻幀的處理進行講解,因為其方法與單個圖像相同,在接下來的完整代碼中,給出對連續(xù)視頻幀進行增強現(xiàn)實的代碼。

完整代碼

import cv2

# 用于人臉和鼻子檢測的級聯(lián)分類器
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
nose_cascade = cv2.CascadeClassifier("haarcascade_mcs_nose.xml")

# 加載胡子圖像
img_moustache = cv2.imread('moustache.png', -1)
# 創(chuàng)建胡子蒙版
img_moustache_mask = img_moustache[:, :, 3]
# 將胡子圖像轉(zhuǎn)換為 BGR 圖像
img_moustache = img_moustache[:, :, 0:3]

# 創(chuàng)建 VideoCapture 對象
video_capture = cv2.VideoCapture(0)

while True:
    # 從 VideoCapture 對象捕獲幀
    ret, frame = video_capture.read()
    # 將 frame 轉(zhuǎn)換為灰度圖像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 檢測人臉
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    # 迭代檢測到的人臉
    for (x, y, w, h) in faces:
        # 根據(jù)檢測到的人臉大小創(chuàng)建ROI
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = frame[y:y + h, x:x + w]
        # 在檢測到的人臉中檢測鼻子
        noses = nose_cascade.detectMultiScale(roi_gray)

        for (nx, ny, nw, nh) in noses:
            # 計算將放置 “胡子” 掛件的坐標
            x1 = int(nx - nw / 2)
            x2 = int(nx + nw / 2 + nw)
            y1 = int(ny + nh / 2 + nh / 8)
            y2 = int(ny + nh + nh / 4 + nh / 6)

            if x1 < 0 or x2 < 0 or x2 > w or y2 > h:
                continue

            # 計算“胡子”掛件區(qū)域的尺寸
            img_moustache_res_width = int(x2 - x1)
            img_moustache_res_height = int(y2 - y1)

            # 根據(jù)掛件區(qū)域縮放“胡子”蒙版
            mask = cv2.resize(img_moustache_mask, (img_moustache_res_width, img_moustache_res_height))
            # 翻轉(zhuǎn)蒙版
            mask_inv = cv2.bitwise_not(mask)
            # 縮放“胡子”掛件
            img = cv2.resize(img_moustache, (img_moustache_res_width, img_moustache_res_height))

            # 從原始圖像中獲取ROI
            roi = roi_color[y1:y2, x1:x2]
            # 創(chuàng)建ROI前景和背景
            roi_bakground = cv2.bitwise_and(roi, roi, mask=mask_inv)
            roi_foreground = cv2.bitwise_and(img, img, mask=mask)

            # roi_bakground 與 roi_foreground 加和獲取結(jié)果
            res = cv2.add(roi_bakground, roi_foreground)
            roi_color[y1:y2, x1:x2] = res

            break
    # 顯示結(jié)果
    cv2.imshow('Snapchat-based OpenCV moustache overlay', frame)

    # 按下 “q” 鍵退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 釋放資源
video_capture.release()
cv2.destroyAllWindows()

眼鏡掛件融合

在這一實戰(zhàn)程序中,我們將學(xué)習在檢測到的面部眼睛區(qū)域上融合眼鏡掛件。我們通過下圖首次查看程序預(yù)期結(jié)果:


同樣為了實現(xiàn)眼鏡掛件融合,需要首先使用眼睛檢測器檢測圖像中的眼睛:

eyepair_cascade= cv2.CascadeClassifier("haarcascade_mcs_eyepair_big.xml")

上圖中青色矩形表示檢測到的人臉在圖像中的位置和大?。环奂t色矩形表示圖像中檢測到的眼睛;黃色矩形表示眼鏡將被覆蓋的位置,其根據(jù)眼睛所在區(qū)域的位置和大小進行計算。

同時,為融合的眼鏡眼鏡掛件圖像增加一些透明度,以使它們更逼真,眼鏡圖像蒙版如下所示:

融合后的結(jié)果圖像如下圖所示:

完整代碼

基本代碼與上例相同,因此不再進行贅述,需要注意的是“眼鏡”掛件的融合區(qū)域計算。

import cv2

face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
eyepair_cascade = cv2.CascadeClassifier("haarcascade_mcs_eyepair_big.xml")

img_glasses = cv2.imread('glasses.png', -1)
img_glasses_mask = img_glasses[:, :, 3]
img_glasses = img_glasses[:, :, 0:3]

video_capture = cv2.VideoCapture(0)

while True:
    ret, frame = video_capture.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 檢測人臉
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x, y, w, h) in faces:
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = frame[y:y + h, x:x + w]

        # 在檢測到的人臉中檢測眼睛
        eyepairs = eyepair_cascade.detectMultiScale(roi_gray)

        for (ex, ey, ew, eh) in eyepairs:
            # 計算“眼睛”掛件放置的坐標
            x1 = int(ex - ew / 10)
            x2 = int((ex + ew) + ew / 10)
            y1 = int(ey)
            y2 = int(ey + eh + eh / 2)

            if x1 < 0 or x2 < 0 or x2 > w or y2 > h:
                continue

            # 計算“眼睛”掛件放置區(qū)域大小
            img_glasses_res_width = int(x2 - x1)
            img_glasses_res_height = int(y2 - y1)


            mask = cv2.resize(img_glasses_mask, (img_glasses_res_width, img_glasses_res_height))
            mask_inv = cv2.bitwise_not(mask)
            img = cv2.resize(img_glasses, (img_glasses_res_width, img_glasses_res_height))

            roi = roi_color[y1:y2, x1:x2]
            roi_bakground = cv2.bitwise_and(roi, roi, mask=mask_inv)
            roi_foreground = cv2.bitwise_and(img, img, mask=mask)

            res = cv2.add(roi_bakground, roi_foreground):
            roi_color[y1:y2, x1:x2] = res

            break

    # 顯示結(jié)果畫面
    cv2.imshow('Snapchat-based OpenCV glasses filter', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()

以上就是Python實戰(zhàn)之基于OpenCV的美顏掛件制作的詳細內(nèi)容,更多關(guān)于Python OpenCV的內(nèi)容請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實現(xiàn)多行注釋的另類方法

    Python實現(xiàn)多行注釋的另類方法

    這篇文章主要介紹了Python實現(xiàn)多行注釋的另類方法,本文使用的是Python多行文本功能來另類的實現(xiàn)Python的多行注釋,需要的朋友可以參考下
    2014-08-08
  • Python隨機生成手機號、數(shù)字的方法詳解

    Python隨機生成手機號、數(shù)字的方法詳解

    這篇文章主要介紹了Python隨機生成手機號、數(shù)字的方法,結(jié)合完整實例形式分析了Python編程生成隨機手機號與數(shù)字的實現(xiàn)方法及相關(guān)函數(shù)用法,需要的朋友可以參考下
    2017-07-07
  • Python中JsonPath提取器和正則提取器

    Python中JsonPath提取器和正則提取器

    本文主要介紹了Python中JsonPath提取器和正則提取器,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-03-03
  • Python中的集合介紹

    Python中的集合介紹

    今天小編就為大家分享一篇關(guān)于Python中的集合介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Python開發(fā)之os與os.path的使用小結(jié)

    Python開發(fā)之os與os.path的使用小結(jié)

    這篇文章主要介紹了Python開發(fā)之os與os.path的使用小結(jié),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2024-05-05
  • Python中運維神器Psutil的用法詳解

    Python中運維神器Psutil的用法詳解

    Python的開源庫psutil為我們提供了一個強大的工具,能夠輕松獲取和分析系統(tǒng)利用率的信息,下面就跟隨小編一起深入了解一下它的具體使用吧
    2025-02-02
  • OpenCV半小時掌握基本操作之濾波器

    OpenCV半小時掌握基本操作之濾波器

    這篇文章主要介紹了OpenCV基本操作之濾波器,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Python實現(xiàn)孤立隨機森林算法的示例代碼

    Python實現(xiàn)孤立隨機森林算法的示例代碼

    孤立森林(isolation?Forest)是一種高效的異常檢測算法,它和隨機森林類似,但每次選擇劃分屬性和劃分點(值)時都是隨機的,而不是根據(jù)信息增益或基尼指數(shù)來選擇。本文將用Python實現(xiàn)這一算法,需要的可以參考一下
    2022-03-03
  • Django創(chuàng)建一個后臺的基本步驟記錄

    Django創(chuàng)建一個后臺的基本步驟記錄

    這篇文章主要給大家介紹了關(guān)于Django創(chuàng)建一個后臺的基本步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-10-10
  • python tkinter實現(xiàn)簡單計算器功能

    python tkinter實現(xiàn)簡單計算器功能

    這篇文章主要為大家詳細介紹了python tkinter實現(xiàn)簡單計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

祁门县| 大竹县| 西城区| 方城县| 富川| 满城县| 河池市| 万山特区| 阿尔山市| 滕州市| 林芝县| 财经| 嘉祥县| 方城县| 桓仁| 抚顺市| 张家界市| 盐津县| 溧阳市| 河间市| 西乡县| 申扎县| 曲周县| 定兴县| 大荔县| 武冈市| 鄄城县| 象山县| 石泉县| 广水市| 沙河市| 阳春市| 湘阴县| 赞皇县| 高要市| 保定市| 若尔盖县| 宣恩县| 富川| 宜丰县| 五寨县|