python 使用OpenCV進行簡單的人像分割與合成
實現(xiàn)思路
通過背景建模的方法,對源圖像中的動態(tài)人物前景進行分割,再將目標圖像作為背景,進行合成操作,獲得一個可用的合成影像。
實現(xiàn)步驟如下。
使用BackgroundSubtractorMOG2進行背景分割
BackgroundSubtractorMOG2是一個以高斯混合模型為基礎的背景前景分割算法,
混合高斯模型
分布概率是K個高斯分布的和,每個高斯分布有屬于自己的 μμ 和 σσ 參數(shù),以及對應的權(quán)重參數(shù),權(quán)重值必須為正數(shù),所有權(quán)重的和必須等于1,以確保公式給出數(shù)值是合理的概率密度值。換句話說如果我們把該公式對應的輸入空間合并起來,結(jié)果將等于1。
回到原算法,它的一個特點是它為每一個像素選擇一個合適數(shù)目的高斯分布?;诟咚鼓P偷钠谕蜆藴什顏砼袛嗷旌细咚鼓P湍P椭械哪膫€高斯模型更有可能對應這個像素點,如果不符合就會被判定為前景。
使用人像識別填充面部信息
創(chuàng)建級聯(lián)分類器
face_cascade = cv2.CascadeClassifier() face_cascade.load( '/usr/local/anaconda3/envs/OpenCV/lib/python3.8/site-packages/cv2/data/haarcascade_frontalface_default.xml')
使用OpenCV自帶的級聯(lián)分類器,加載OpenCV的基礎人像識別數(shù)據(jù)。
識別源圖像中的人像
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
使用形態(tài)學填充分割出來的前景
# 形態(tài)學開運算去噪點 fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel) for i in range(15): fgmask = cv2.dilate(fgmask, kernel, iterations=1)
通過開操作去掉前景圖像數(shù)組中的噪點,然后重復進行膨脹,填充前景輪廓。
將人像與目標背景進行合成
def resolve(o_img, mask, faces): if len(faces) == 0: return (x, y, w, h) = faces[0] rgb_mask_front = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR) rgb_mask_front = cv2.bitwise_not(rgb_mask_front) cv2.circle(rgb_mask_front, (int(x + w / 2), int(y + h / 2)), int((w + h) / 4), (0, 0, 0), thickness=-1) o_img = cv2.subtract(o_img, rgb_mask_front) return o_img
將分割出來的部分取反再與源圖像進行減操作,相當于用一個Mask從原圖中摳出一部分。
再與背景進行加操作
out = resolve(frame, fgmask, faces) out = cv2.add(out, c_frame)
代碼實現(xiàn)
import numpy as np import cv2 import os # 經(jīng)典的測試視頻 camera = cv2.VideoCapture('./source/background_test2.avi') cap = cv2.VideoCapture('./source/camera_test2.avi') face_cascade = cv2.CascadeClassifier() face_cascade.load( os.getcwd()+'/source/haarcascade_frontalface_default.xml') # 形態(tài)學操作需要使用 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # 創(chuàng)建混合高斯模型用于背景建模 fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows=False) def resolve(o_img, mask, faces): if len(faces) == 0: return (x, y, w, h) = faces[0] rgb_mask_front = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR) rgb_mask_front = cv2.bitwise_not(rgb_mask_front) cv2.circle(rgb_mask_front, (int(x + w / 2), int(y + h / 2)), int((w + h) / 4), (0, 0, 0), thickness=-1) o_img = cv2.subtract(o_img, rgb_mask_front) return o_img while True: ret, frame = cap.read() c_ret, c_frame = camera.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) fgmask = fgbg.apply(frame) # 形態(tài)學開運算去噪點 fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel) gray_camera = cv2.cvtColor(c_frame, cv2.COLOR_BGR2GRAY) for i in range(15): fgmask = cv2.dilate(fgmask, kernel, iterations=1) faces = face_cascade.detectMultiScale(gray, 1.3, 5) out = resolve(frame, fgmask, faces) out = cv2.add(out, c_frame) cv2.imshow('Result', out) cv2.imshow('Mask', fgmask) k = cv2.waitKey(150) & 0xff if k == 27: break out.release() camera.release() cap.release() cv2.destroyAllWindows()
以上就是python 使用OpenCV進行簡單的人像分割與合成的詳細內(nèi)容,更多關(guān)于python opencv人像分割與合成的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python OpenCV高斯金字塔與拉普拉斯金字塔的實現(xiàn)
- Python OpenCV 基于圖像邊緣提取的輪廓發(fā)現(xiàn)函數(shù)
- Python opencv操作深入詳解
- Python+Opencv實現(xiàn)數(shù)字識別的示例代碼
- python中的opencv和PIL(pillow)轉(zhuǎn)化操作
- Python OpenCV 圖像區(qū)域輪廓標記(框選各種小紙條)
- python opencv 找出圖像中的最大輪廓并填充(生成mask)
- python利用opencv實現(xiàn)顏色檢測
- Python基于opencv的簡單圖像輪廓形狀識別(全網(wǎng)最簡單最少代碼)
- python基于OpenCV模板匹配識別圖片中的數(shù)字
相關(guān)文章
Python使用Virtualenv進行虛擬環(huán)境管理的詳細步驟
Virtualenv是一個Python環(huán)境管理工具,它允許開發(fā)者在不同的項目之間獨立創(chuàng)建和管理各自的Python環(huán)境,通過virtualenv,你可以為每個項目安裝特定版本的Python解釋器以及項目的依賴庫,本文給大家介紹了Python使用Virtualenv進行虛擬環(huán)境管理的詳細步驟2024-09-09詳解centos7+django+python3+mysql+阿里云部署項目全流程
這篇文章主要介紹了詳解centos7+django+python3+mysql+阿里云部署項目全流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11Python利用Bokeh進行數(shù)據(jù)可視化的教程分享
Bokeh是Python中的數(shù)據(jù)可視化庫,提供高性能的交互式圖表和繪圖。本文將利用Bokeh繪制一些可視化圖表,文中的示例代碼講解詳細,感興趣的可以了解一下2022-08-08Django模板標簽中url使用詳解(url跳轉(zhuǎn)到指定頁面)
這篇文章主要介紹了Django模板標簽中url使用詳解(url跳轉(zhuǎn)到指定頁面),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03node.js獲取參數(shù)的常用方法(總結(jié))
下面小編就為大家?guī)硪黄猲ode.js獲取參數(shù)的常用方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05