本記事では、下記リンク先のように人(全身)にモザイク処理する動画編集の雛形コードを載せました。ライブラリは「OpenCV」を活用します。
www.youtube.com
人の全身の他に、顔、目だけなどといったカスケードファイル(学習済み分類学習器)を用いることで同様のことができます。ダウンロード方法は下記リンク先を参照下さい。
hk29.hatenablog.jp
■本プログラム
検出精度を高めるには、パラメータの最適解を探索する。 もしくは自分で学習器を作成するかです。
import cv2
from PIL import Image, ImageFont, ImageDraw
import moviepy.editor as mp
def image_recognition_and_mosaic_func(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
detection_list = cascade.detectMultiScale(
gray,
scaleFactor = 1.1,
minNeighbors = 2,
minSize=(20, 20)
)
for (x, y, w, h) in detection_list:
detection= img[y:y+h, x:x+w]
reduc = cv2.resize(detection, (int(w * 0.05), int(h * 0.05)))
mosaic = cv2.resize(reduc,(w, h))
img[y:y+h, x:x+w] = mosaic
text = 'pepole'
cv2.putText(img, text, (x, y-10),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 2, cv2.LINE_AA)
return img
def extract_and_set_audio(input_video1, input_video2, out_file, out_audio):
clip_in = mp.VideoFileClip(input_video1).subclip()
clip_in.audio.write_audiofile(out_audio)
clip_out = mp.VideoFileClip(input_video2).subclip()
clip_out.write_videofile(out_file, audio = out_audio)
def main():
video = cv2.VideoCapture(input_video)
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
size = (width, height)
frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
fps = int(video.get(cv2.CAP_PROP_FPS))
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
writer = cv2.VideoWriter(out_video1, fourcc, fps, (width, height))
for i in range(frames):
ret, frame = video.read()
dst = image_recognition_and_mosaic_func(frame)
writer.write(dst)
if i % 10 == 0:
print(str(i) + "/" + str(frames))
writer.release()
video.release()
print("frames -> " + str(frames))
print("fps -> " + str(fps))
input_video2 = out_video1
extract_and_set_audio(input_video, input_video2, out_video2, out_audio)
if __name__ == '__main__':
input_video = 'IMG_2790.MOV'
out_video1 = 'zzz_mosaic.mp4'
out_audio = 'zzz_voice.mp3'
out_video2 = 'zzz_mosaic_with_voice.mp4'
cascade_path = r'C:/Users//Anaconda3/Lib/site-packages/cv2/data/haarcascade_fullbody.xml'
cascade = cv2.CascadeClassifier(cascade_path)
main()
以上
<広告>
リンク