|  | import cv2, os | 
					
						
						|  | import numpy as np | 
					
						
						|  | from tqdm import tqdm | 
					
						
						|  | import uuid | 
					
						
						|  |  | 
					
						
						|  | from src.utils.videoio import save_video_with_watermark | 
					
						
						|  |  | 
					
						
						|  | def paste_pic(video_path, pic_path, crop_info, new_audio_path, full_video_path, extended_crop=False): | 
					
						
						|  |  | 
					
						
						|  | if not os.path.isfile(pic_path): | 
					
						
						|  | raise ValueError('pic_path must be a valid path to video/image file') | 
					
						
						|  | elif pic_path.split('.')[-1] in ['jpg', 'png', 'jpeg']: | 
					
						
						|  |  | 
					
						
						|  | full_img = cv2.imread(pic_path) | 
					
						
						|  | else: | 
					
						
						|  |  | 
					
						
						|  | video_stream = cv2.VideoCapture(pic_path) | 
					
						
						|  | fps = video_stream.get(cv2.CAP_PROP_FPS) | 
					
						
						|  | full_frames = [] | 
					
						
						|  | while 1: | 
					
						
						|  | still_reading, frame = video_stream.read() | 
					
						
						|  | if not still_reading: | 
					
						
						|  | video_stream.release() | 
					
						
						|  | break | 
					
						
						|  | break | 
					
						
						|  | full_img = frame | 
					
						
						|  | frame_h = full_img.shape[0] | 
					
						
						|  | frame_w = full_img.shape[1] | 
					
						
						|  |  | 
					
						
						|  | video_stream = cv2.VideoCapture(video_path) | 
					
						
						|  | fps = video_stream.get(cv2.CAP_PROP_FPS) | 
					
						
						|  | crop_frames = [] | 
					
						
						|  | while 1: | 
					
						
						|  | still_reading, frame = video_stream.read() | 
					
						
						|  | if not still_reading: | 
					
						
						|  | video_stream.release() | 
					
						
						|  | break | 
					
						
						|  | crop_frames.append(frame) | 
					
						
						|  |  | 
					
						
						|  | if len(crop_info) != 3: | 
					
						
						|  | print("you didn't crop the image") | 
					
						
						|  | return | 
					
						
						|  | else: | 
					
						
						|  | r_w, r_h = crop_info[0] | 
					
						
						|  | clx, cly, crx, cry = crop_info[1] | 
					
						
						|  | lx, ly, rx, ry = crop_info[2] | 
					
						
						|  | lx, ly, rx, ry = int(lx), int(ly), int(rx), int(ry) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | if extended_crop: | 
					
						
						|  | oy1, oy2, ox1, ox2 = cly, cry, clx, crx | 
					
						
						|  | else: | 
					
						
						|  | oy1, oy2, ox1, ox2 = cly+ly, cly+ry, clx+lx, clx+rx | 
					
						
						|  |  | 
					
						
						|  | tmp_path = str(uuid.uuid4())+'.mp4' | 
					
						
						|  | out_tmp = cv2.VideoWriter(tmp_path, cv2.VideoWriter_fourcc(*'MP4V'), fps, (frame_w, frame_h)) | 
					
						
						|  | for crop_frame in tqdm(crop_frames, 'seamlessClone:'): | 
					
						
						|  | p = cv2.resize(crop_frame.astype(np.uint8), (ox2-ox1, oy2 - oy1)) | 
					
						
						|  |  | 
					
						
						|  | mask = 255*np.ones(p.shape, p.dtype) | 
					
						
						|  | location = ((ox1+ox2) // 2, (oy1+oy2) // 2) | 
					
						
						|  | gen_img = cv2.seamlessClone(p, full_img, mask, location, cv2.NORMAL_CLONE) | 
					
						
						|  | out_tmp.write(gen_img) | 
					
						
						|  |  | 
					
						
						|  | out_tmp.release() | 
					
						
						|  |  | 
					
						
						|  | save_video_with_watermark(tmp_path, new_audio_path, full_video_path, watermark=False) | 
					
						
						|  | os.remove(tmp_path) | 
					
						
						|  |  |