思考题 可以综合使用多种图像代数运算函数来完成一系列的操作,达到视频合成的目的。 提示: (1)有一个视频V1,需要作为背景; (2)从摄像头获取自己的视频,把背景替换为V1; (3)在视频下方加动态字幕; 保存视频。
代码如下:
import cv2 cap = cv2.VideoCapture(0) # 摄像头编号。(1)有一个视频V1,需要作为背景;从摄像头获取自己的视频,把背景替换为V1; cap2 = cv2.VideoCapture('vtest.avi') flag = True font = cv2.FONT_HERSHEY_SIMPLEX string = ['message1', 'message2', 'message3', ''] num = 0 fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480)) def showMessage(event,x,y,flags,param): global flag if event == cv2.EVENT_LBUTTONDOWN: flag = (not flag) while(cap.isOpened() & cap2.isOpened()): ret, frame = cap.read() ret2, frame2 = cap2.read() if (ret == True) & (ret2 == True): # 摄像头翻转 frame = cv2.flip(frame, 1) rows1, cols1, channels1 = frame.shape rows, cols, channels = frame2.shape roi = frame2[0:rows1, 0:cols1] # 自身头像的截取 framegrey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) ret, mask_front = cv2.threshold(framegrey, 110, 255, cv2.THRESH_BINARY) mask_inv = cv2.bitwise_not(mask_front) frame_fg = cv2.bitwise_and(frame, frame, mask=mask_inv) # 背景视频放置 frame_bg = cv2.bitwise_and(roi, roi, mask=mask_front) frame_add = cv2.add(frame_fg, frame_bg) frame2[0:rows1, 0:cols1] = frame_add frame_last = frame2[0:rows1, 0:cols1] # 添加字幕 num += 200 if flag: num %= 3 else: num = 3 messageFrame = cv2.putText(frame_last, string[num], (200, 400), font, 1, (0, 0, 255), 2) cv2.setMouseCallback('frame2', showMessage) # 展示并保存 cv2.imshow('frame2', frame_last) # out.write(frame_last) if cv2.waitKey(1) & 0xFF == ord('q'): break # Release everything if job is finished cap.release() cv2.destroyAllWindows()