亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

怎么在python使用OpenCV進行人像分割與合成

發布時間:2021-02-03 10:00:21 來源:億速云 閱讀:213 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關怎么在python使用OpenCV進行人像分割與合成,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

實現思路

通過背景建模的方法,對源圖像中的動態人物前景進行分割,再將目標圖像作為背景,進行合成操作,獲得一個可用的合成影像。

實現步驟如下。

使用BackgroundSubtractorMOG2進行背景分割

BackgroundSubtractorMOG2是一個以高斯混合模型為基礎的背景前景分割算法,

混合高斯模型

怎么在python使用OpenCV進行人像分割與合成

分布概率是K個高斯分布的和,每個高斯分布有屬于自己的 μμ 和 σσ 參數,以及對應的權重參數,權重值必須為正數,所有權重的和必須等于1,以確保公式給出數值是合理的概率密度值。換句話說如果我們把該公式對應的輸入空間合并起來,結果將等于1。

回到原算法,它的一個特點是它為每一個像素選擇一個合適數目的高斯分布。基于高斯模型的期望和標準差來判斷混合高斯模型模型中的哪個高斯模型更有可能對應這個像素點,如果不符合就會被判定為前景。

使用人像識別填充面部信息

創建級聯分類器

face_cascade = cv2.CascadeClassifier()
face_cascade.load(
  '/usr/local/anaconda3/envs/OpenCV/lib/python3.8/site-packages/cv2/data/haarcascade_frontalface_default.xml')

使用OpenCV自帶的級聯分類器,加載OpenCV的基礎人像識別數據。

識別源圖像中的人像

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

使用形態學填充分割出來的前景

# 形態學開運算去噪點
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
for i in range(15):
  fgmask = cv2.dilate(fgmask, kernel, iterations=1)

通過開操作去掉前景圖像數組中的噪點,然后重復進行膨脹,填充前景輪廓。

將人像與目標背景進行合成

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)

代碼實現

import numpy as np
import cv2
import os

# 經典的測試視頻
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')
# 形態學操作需要使用
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
# 創建混合高斯模型用于背景建模
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)
  # 形態學開運算去噪點
  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進行人像分割與合成有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肃南| 龙里县| 富川| 昌宁县| 舟山市| 台前县| 保靖县| 大理市| 延津县| 咸丰县| 交城县| 尉犁县| 沂水县| 和龙市| 昂仁县| 威海市| 蓝田县| 邮箱| 灌南县| 麻江县| 张家港市| 横峰县| 馆陶县| 安新县| 集贤县| 呼和浩特市| 清水河县| 忻州市| 深泽县| 牡丹江市| 交口县| 中西区| 延长县| 漳州市| 延安市| 潮安县| 牙克石市| 台南县| 彭州市| 新巴尔虎左旗| 灵石县|