視頻馬賽克去除工具:視頻打馬賽克軟件哪個最好用

上期文章,我們分享了如何給圖片添加馬賽克,但是很多時候,我們需要給視頻添加馬賽克。當然你能想到的是通過後期軟件處理的方法來進行,本文教你使用簡單的幾行代碼便可以很方便的給視頻添加馬賽克

添加馬賽克步驟

1、給定要添加的視頻或者圖片

2、利用人工智能技術識別圖片或者視頻中的人臉

3、創建屏蔽層

4、給圖片或者視頻添加上屏蔽層

5、顯示最終的圖片或者實時同步到視頻 中

創建屏蔽層

給圖片或者視頻人臉添加馬賽克,最主要步驟是創建屏蔽層,我們利用2種方式進行人臉的打碼

import numpy as np

import cv2

def face_blur(image, factor=3.0):

(h, w) = image.shape[:2]

kW = int(w / factor)

kH = int(h / factor) #高斯內核

if kW % 2 == 0:

kW -= 1

if kH % 2 == 0:

kH -= 1

return cv2.GaussianBlur(image, (kW, kH), 0)

以上便是很簡單的創建屏蔽層的代碼

首先我們獲取了圖片的尺寸(h, w) = image.shape[:2]

利用要使用高斯運算,我們要計算高斯內核的尺寸

kW = int(w / factor)

kH = int(h / factor)

以上計算了高斯內核的基本尺寸,由於高斯內核的尺寸只要求是奇數,當我們檢測到基數時,需要轉成為奇數。最後使用cv2.GaussianBlur(image, (kW, kH), 0)來創建屏蔽層

高斯函數

高斯濾波是一種線性平滑濾波,對於除去高斯噪聲有很好的效果。

在圖像處理中高斯濾波一般有兩種實現方式:一種是用離散化窗口滑窗卷積,另一種是通過傅里葉變換。最常見的就是第一種滑窗實現,只有當離散化的窗口非常大,用滑窗計算量非常大的情況下會考慮基於傅里葉變換的方法。

opencv提供了GaussianBlur()函數對圖形進行高斯濾波,其原型如下:

C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )

參數解釋:

. InputArray src: 輸入圖像,可以是Mat類型,圖像深度為CV_8U、CV_16U、CV_16S、CV_32F、CV_64F。

. OutputArray dst: 輸出圖像,與輸入圖像有相同的類型和尺寸。

. Size ksize: 高斯內核大小,這個尺寸與前面兩個濾波kernel尺寸不同,ksize.width和ksize.height可以不相同但是這兩個值必須為正奇數,如果這兩個值為0,他們的值將由sigma計算。

. double sigmaX: 高斯核函數在X方向上的標準偏差

. double sigmaY: 高斯核函數在Y方向上的標準偏差,如果sigmaY是0,則函數會自動將sigmaY的值設置為與sigmaX相同的值,如果sigmaX和sigmaY都是0,這兩個值將由ksize.width和ksize.height計算而來。具體可以參考getGaussianKernel()函數查看具體細節。建議將size、sigmaX和sigmaY都指定出來。

. int borderType=BORDER_DEFAULT: 推斷圖像外部像素的某種便捷模式,有默認值BORDER_DEFAULT,如果沒有特殊需要不用更改,具體可以參考borderInterpolate()函數。如何給視頻實時添加馬賽克,這個小技巧顛覆你的想像

高斯屏蔽

自建馬斯克圖像

高斯函數的馬賽克十分平滑,但是這跟我們平時見到的馬斯克有所區別,我們新建一個函數來創建自己的馬斯克

def face_blur(image, blocks=5):

(h, w) = image.shape[:2]

xSteps = np.linspace(0, w, blocks + 1, dtype=”int”)

ySteps = np.linspace(0, h, blocks + 1, dtype=”int”)

for i in range(1, len(ySteps)):

for j in range(1, len(xSteps)):

startX = xSteps[j – 1]

startY = ySteps[i – 1]

endX = xSteps[j]

endY = ySteps[i]

roi = image[startY:endY, startX:endX]

(B, G, R) = [int(x) for x in cv2.mean(roi)[:3]]

cv2.rectangle(image, (startX, startY), (endX, endY),(B, G, R), -1)

return image

首先獲取了圖片的尺寸,把圖片分成block*block的小方塊

計算每個小方塊的初始位置與最終位置

把每個小方塊圖片提取roi = image[startY:endY, startX:endX]

opencv中封裝了一個專門用於求解cv::Mat均值的函數,即cv::mean(&cv::Mat),該函數會得到Mat中各個通道的均值,若要獲取指定通道的均值,做進一步解析即可。

最後把獲取的平均值畫到原始圖片中,來實現加馬賽克的效果如何給視頻實時添加馬賽克,這個小技巧顛覆你的想像

馬賽克

函數中的blocks定義了圖片需要進行馬賽克的小方塊的數量,以上圖片的馬賽克跟我們見到的很是類似

加載模型,開啟攝像頭

prototxtFacePath = “model/deploy.prototxt”

weightsFacePath = “model/res10_300x300_ssd_iter_140000.caffemodel”

faceNet = cv2.dnn.readNet(prototxtFacePath, weightsFacePath)

capture = cv2.VideoCapture(0)

time.sleep(2.0)

首先我們加載需要的人臉檢測模型

使用cv2.dnn.readNet(prototxtFacePath, weightsFacePath)函數初始化一個人臉檢測神經網絡

VideoCapture()中參數是0,表示打開筆記本的內置攝像頭,參數是視頻文件路徑則打開視頻,如cap = cv2.VideoCapture(「../高清.avi」)

默認打開攝像頭,然後遍歷視頻,實時添加馬賽克

讀取視頻幀,實時檢測人臉

while True:

ret, frame = capture.read()

frame = cv2.resize(frame, (600,400))

(h, w) = frame.shape[:2]

blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),(104.0, 177.0, 123.0))

faceNet.setInput(blob)

detections = faceNet.forward()

cap.read()按幀讀取視頻,ret,frame是獲cap.read()方法的兩個返回值。其中ret是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結尾,它的返回值就為False。frame就是每一幀的圖像,是個三維矩陣。

獲取圖片的尺寸大小,然後進行圖片blob值的計算blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300),(104.0, 177.0, 123.0))

最後進行人臉神經網絡的預測

faceNet.setInput(blob)

detections = faceNet.forward()

當檢測到人臉後,對人臉進行分析識別

for i in range(0, detections.shape[2]):

confidence = detections[0, 0, i, 2]

if confidence > 0.5:

box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])

(startX, startY, endX, endY) = box.astype(“int”)

face = frame[startY:endY, startX:endX]

face = face_blur(face, factor=4.0)

frame[startY:endY, startX:endX] = face

當檢測到人臉後,提取所有人臉的置信度,我們判斷大於0.5的人臉置信度為可靠人臉.

計算人臉在圖片中的位置(startX, startY, endX, endY) = box.astype(“int”)

獲取人臉圖片ROI:face = frame[startY:endY, startX:endX]

根據人臉的ROI圖片來進行高斯模糊,以便達到添加馬賽克的效果

然後把添加馬賽克的圖片實時反饋到視頻幀中

顯示視頻

cv2.imshow(“Frame”, frame)

key = cv2.waitKey(1) & 0xFF

if key == ord(“q”):

break

cv2.stop()

cv2.destroyAllWindows()

最後實時顯示視頻。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/224741.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:40
下一篇 2024-12-09 14:40

相關推薦

發表回復

登錄後才能評論