Advertisement
Guest User

Untitled

a guest
Apr 6th, 2022
450
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.67 KB | None | 0 0
  1. import os
  2. import cv2
  3. import math
  4. import time
  5. import numpy as np
  6.  
  7. AVERAGING_LENGTH = 7
  8. FPS = 60.0
  9. OFFSET_TO_ANALYZE = 0
  10. FRACTION_TO_ANALYZE = 1
  11.  
  12. NUM_SINGLE = 3022
  13. NUM_DOUBLE = 2723
  14. NUM_QUADRO = 3983
  15. single_images_0_path = sorted([img for img in os.listdir('images_single')])
  16. double_images_0_path = sorted([img for img in os.listdir('images_double/0')])
  17. double_images_1_path = sorted([img for img in os.listdir('images_double/1')])
  18. quadro_images_0_path = sorted([img for img in os.listdir('images_quadro/0')])
  19. quadro_images_1_path = sorted([img for img in os.listdir('images_quadro/1')])
  20. quadro_images_2_path = sorted([img for img in os.listdir('images_quadro/2')])
  21. quadro_images_3_path = sorted([img for img in os.listdir('images_quadro/3')])
  22.  
  23. def map_by_layer(image, f, mask):
  24.     mask_3d = np.zeros((mask.shape[0], mask.shape[1], 3))
  25.     mask_3d[:, :, 0] = mask
  26.     mask_3d[:, :, 1] = mask
  27.     mask_3d[:, :, 2] = mask
  28.     return np.where(mask_3d, f(image), image)
  29.  
  30. def image_difference_mask(prev, curr):
  31.     difference = cv2.subtract(prev, curr)
  32.     b, g, r = cv2.split(difference)
  33.     (_, mask) = cv2.threshold(cv2.bitwise_or(b, cv2.bitwise_or(g, r)), 1, 255, cv2.THRESH_BINARY)
  34.     return mask
  35.  
  36. def images_difference(images):
  37.     mask = np.zeros((images[0].shape[0], images[0].shape[1]), dtype=np.uint8)
  38.     prev = images[0]
  39.     for i in range(1, len(images)):
  40.         mask = cv2.bitwise_or(mask, image_difference_mask(prev, images[i]))
  41.         prev = images[i]
  42.  
  43.     return map_by_layer(images[-1], lambda x: x // 3, np.logical_not(mask))
  44.  
  45. def image_difference(prev, curr):
  46.     mask = image_difference_mask(prev, curr)
  47.     return cv2.bitwise_and(curr, curr, mask=mask)
  48.  
  49. def load_image(i):
  50.     if i < NUM_SINGLE:
  51.         image = cv2.imread(os.path.join('images_single', single_images_0_path[i]))
  52.         image = np.concatenate((image, 255*np.ones(image.shape, dtype=np.uint8)), axis=0)
  53.         image = np.concatenate((image, 255*np.ones(image.shape, dtype=np.uint8)), axis=1)
  54.     elif i < NUM_SINGLE + NUM_DOUBLE:
  55.         image_0 = cv2.imread(os.path.join('images_double/0', double_images_0_path[i - NUM_SINGLE]))
  56.         image_1 = cv2.imread(os.path.join('images_double/1', double_images_1_path[i - NUM_SINGLE]))
  57.         image = np.concatenate((image_0, image_1), axis=1)
  58.         image = np.concatenate((image, 255*np.ones(image.shape, dtype=np.uint8)), axis=0)
  59.     elif i < NUM_SINGLE + NUM_DOUBLE + NUM_QUADRO:
  60.         image_0 = cv2.imread(os.path.join('images_quadro/0', quadro_images_0_path[i - NUM_SINGLE - NUM_DOUBLE]))
  61.         image_1 = cv2.imread(os.path.join('images_quadro/1', quadro_images_1_path[i - NUM_SINGLE - NUM_DOUBLE]))
  62.         image_2 = cv2.imread(os.path.join('images_quadro/2', quadro_images_2_path[i - NUM_SINGLE - NUM_DOUBLE]))
  63.         image_3 = cv2.imread(os.path.join('images_quadro/3', quadro_images_3_path[i - NUM_SINGLE - NUM_DOUBLE]))
  64.         image_top = np.concatenate((image_0, image_1), axis=1)
  65.         image_bottom = np.concatenate((image_2, image_3), axis=1)
  66.         image = np.concatenate((image_top, image_bottom), axis=0)
  67.     else:
  68.         print("Unsupported")
  69.  
  70.     return image
  71.  
  72.  
  73. start = time.time()
  74.  
  75. video_name = 'video1.mp4'
  76. frame = load_image(0)
  77. height, width, layers = frame.shape
  78. fourcc = cv2.VideoWriter_fourcc(*'MP4V')
  79. video = cv2.VideoWriter(video_name, fourcc, FPS, (width,height))
  80.  
  81. next_images = [None] + [load_image(i) for i in range(0, AVERAGING_LENGTH-1)]
  82. max_range = OFFSET_TO_ANALYZE + math.floor((NUM_SINGLE + NUM_DOUBLE + NUM_QUADRO)*FRACTION_TO_ANALYZE) - AVERAGING_LENGTH
  83. for i in range(OFFSET_TO_ANALYZE, max_range):
  84.     if i % 100 == 0:
  85.         print(i)
  86.     next_images.append(load_image(i+AVERAGING_LENGTH-1))
  87.     del next_images[0]
  88.     next_frame = images_difference(next_images)
  89.     video.write(next_frame)
  90.  
  91. cv2.destroyAllWindows()
  92. video.release()
  93. end = time.time()
  94. print(end - start)
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement