{"id":458554,"date":"2025-05-05T03:00:24","date_gmt":"2025-05-05T03:00:24","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=458554"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=458554","title":{"rendered":"<span>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0432\u0438\u0434\u0435\u043e \u0438\u0437 2D \u0432 3D \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441 (\u0441\u043a\u0440\u0438\u043f\u0442)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438:<br \/><strong><em>\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c 3D \u0432\u0435\u0440\u0441\u0438\u044e \u043b\u044e\u0431\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u043c\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 StarWars4 (DepthAnythingV2 + Parallax)<\/em><\/strong> (<a href=\"https:\/\/habr.com\/ru\/articles\/897860\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/articles\/897860\/<\/a>)<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439, \u0442\u0430\u043c \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438: \u0441\u0443\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u043d\u0438\u0445. \u0422\u0430\u043a\u0436\u0435 \u0442\u0430\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 3D \u0432\u0438\u0434\u0435\u043e (\u043e\u0442\u0440\u044b\u0432\u043e\u043a StarWars4), \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u043b\u044f VR. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u043d\u0435\u043c\u0443. \u0422\u0430\u043a\u0436\u0435 \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0432\u0438\u0434\u0435\u043e \u0438\u0437 2D \u0432 3D.<\/p>\n<p>\u041f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 3D-\u0433\u0438\u0444\u044b, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <strong>DepthAnythingV2 <\/strong>+ <strong>Parallax<em>.<\/em><\/strong><\/p>\n<h3>\u041d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442<\/h3>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u0438\u043f\u0442:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import os import subprocess from threading import Lock from concurrent.futures import ThreadPoolExecutor from multiprocessing import Value import cv2 import torch import numpy as np  from depth_anything_v2.dpt import DepthAnythingV2   # \u041f\u0410\u0420\u0410\u041c\u0415\u0422\u0420\u042b \u041e\u0411\u0429\u0418\u0415 # \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0444\u0430\u0439\u043b video_file = \"\/home\/user\/video.mkv\" video_name = os.path.splitext(os.path.basename(video_file))[0]  # \u041f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0438 \u043f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0445 3D \u0444\u0440\u0435\u0439\u043c\u043e\u0432 frames_dir = os.path.join(os.path.dirname(video_file), f\"{video_name}_frames\") images3d_dir = os.path.join(os.path.dirname(video_file), f\"{video_name}_3d\") os.makedirs(frames_dir, exist_ok=True) os.makedirs(images3d_dir, exist_ok=True)  frame_counter = Value('i', 0) # \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0434\u0440\u043e\u0432 threads_count = Value('i', 0) # \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b max_threads  chunk_size = 5000  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a max_threads = 3 # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432  # \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 device = torch.device('cuda')   # \u041f\u0410\u0420\u0410\u041c\u0415\u0422\u0420\u042b 3D PARALLAX_SCALE = 15  # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 10 \u0434\u043e 20 PARALLAX_METHOD = 2  # 1 \u0438\u043b\u0438 2 INPAINT_RADIUS = 2  # \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 2 \u0434\u043e 5, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 2-3 INTERPOLATION_TYPE = cv2.INTER_LINEAR TYPE3D = \"FSBS\"  # HSBS, FSBS, HOU, FOU LEFT_RIGHT = \"LEFT\"  # LEFT or RIGHT  # 0 - \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f new_width = 1920 new_height = 1080  # \u041f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u0441\u043b\u0435\u0448\u0430 \u043d\u0430 \u043a\u043e\u043d\u0446\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \"\/home\/user\/DepthAnythingV2\/models\" depth_model_dir = \"\/home\/user\/DepthAnythingV2\/models\"  model_depth_configs = {         'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},         'vitb': {'encoder': 'vitb', 'features': 128, 'out_channels': [96, 192, 384, 768]},         'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]} }  encoder = 'vitl' # 'vitl', 'vitb', 'vits'  model_depth = DepthAnythingV2(**model_depth_configs[encoder]) model_depth.load_state_dict(torch.load(f'{depth_model_dir}\/depth_anything_v2_{encoder}.pth', weights_only=True, map_location=device)) model_depth = model_depth.to(device).eval()    def image_size_correction(current_height, current_width, left_image, right_image):     ''' \u041a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u044b new_width \u0438 new_height '''          # \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f     top = (new_height - current_height) \/\/ 2     left = (new_width - current_width) \/\/ 2          # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0447\u0435\u0440\u043d\u044b\u0439 \u0445\u043e\u043b\u0441\u0442 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430     new_left_image = np.zeros((new_height, new_width, 3), dtype=np.uint8)     new_right_image = np.zeros((new_height, new_width, 3), dtype=np.uint8)          # \u0420\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0447\u0435\u0440\u043d\u043e\u043c \u0444\u043e\u043d\u0435     new_left_image[top:top + current_height, left:left + current_width] = left_image     new_right_image[top:top + current_height, left:left + current_width] = right_image          return new_left_image, new_right_image              def depth_processing(image):     ''' \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0434\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f '''          # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0433\u043b\u0443\u0431\u0438\u043d\u044b     with torch.no_grad():         depth = model_depth.infer_image(image)              # \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b     depth_normalized = (depth - depth.min()) \/ (depth.max() - depth.min())      return depth_normalized  def image3d_processing_method1(image, depth, height, width):     ''' \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b.         \u041c\u0435\u0442\u043e\u04341: \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0439, \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u0431\u043e\u043b\u0435\u0435 \u0441\u0433\u043b\u0430\u0436\u0435\u043d\u043d\u044b\u0435, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u043d\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u043c     '''          # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430     parallax = depth * PARALLAX_SCALE          # \u0421\u0435\u0442\u043a\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442     y, x = np.indices((height, width), dtype=np.float32)      # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439     shift_left = np.clip(x - parallax, 0, width - 1)     shift_right = np.clip(x + parallax, 0, width - 1)      # \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0441 cv2.remap     left_image = cv2.remap(image, shift_left, y, interpolation=INTERPOLATION_TYPE)     right_image = cv2.remap(image, shift_right, y, interpolation=INTERPOLATION_TYPE)      return left_image, right_image      def image3d_processing_method2(image, depth, height, width):     ''' \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b.         \u041c\u0435\u0442\u043e\u04342: \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u0447\u043d\u0435\u0435.     '''          # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430     parallax = depth * PARALLAX_SCALE          # \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 int32     shift = np.round(parallax).astype(np.int32)      # \u0421\u0435\u0442\u043a\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442     y, x = np.indices((height, width))      # \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439     left_image  = np.zeros_like(image)     right_image = np.zeros_like(image)      # \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c     x_src_left = x - shift     valid_left = (x_src_left &gt;= 0) &amp; (x_src_left &lt; width)     left_image[y[valid_left], x[valid_left]] = image[y[valid_left], x_src_left[valid_left]]      # \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c     x_src_right = x + shift     valid_right = (x_src_right &gt;= 0) &amp; (x_src_right &lt; width)     right_image[y[valid_right], x[valid_right]] = image[y[valid_right], x_src_right[valid_right]]          # \u041c\u0430\u0441\u043a\u0438 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u0438\u043d\u043f\u0435\u0439\u043d\u0442\u0438\u043d\u0433\u0430     mask_left  = (~valid_left).astype(np.uint8) * 255     mask_right = (~valid_right).astype(np.uint8) * 255      # \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0443\u0441\u0442\u043e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u043f\u0435\u0439\u043d\u0442\u0438\u043d\u0433     left_image  = cv2.inpaint(left_image,  mask_left,  INPAINT_RADIUS,  cv2.INPAINT_TELEA)     right_image = cv2.inpaint(right_image, mask_right, INPAINT_RADIUS, cv2.INPAINT_TELEA)      return left_image, right_image      def image3d_combining(left_image, right_image, height, width):        ''' \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b \u0432 \u0435\u0434\u0438\u043d\u043e\u0435 3D \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 '''          # \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u044b new_width \u0438 new_height     if new_width and new_height:         left_image, right_image = image_size_correction(height, width, left_image, right_image)         # \u041c\u0435\u043d\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 new_height \u0438 new_width \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0438\u0436\u0435         height = new_height         width = new_width              # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0438\u043b\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435     img1, img2 = (left_image, right_image) if LEFT_RIGHT == \"LEFT\" else (right_image, left_image)          # \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0435\u0434\u0438\u043d\u043e\u0435 3D \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435     if TYPE3D == \"HSBS\":  # \u0421\u0443\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043a\u043b\u0435\u0439\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438         combined_image = np.hstack((cv2.resize(img1, (width \/\/ 2, height), interpolation=cv2.INTER_AREA),                           cv2.resize(img2, (width \/\/ 2, height), interpolation=cv2.INTER_AREA)))                                elif TYPE3D == \"HOU\":  # \u0421\u0443\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043a\u043b\u0435\u0439\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438         combined_image = np.vstack((cv2.resize(img1, (width, height \/\/ 2), interpolation=cv2.INTER_AREA),                           cv2.resize(img2, (width, height \/\/ 2), interpolation=cv2.INTER_AREA)))                                elif TYPE3D == \"FSBS\":  # \u0421\u043a\u043b\u0435\u0439\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438         combined_image = np.hstack((img1, img2))          elif TYPE3D == \"FOU\":  # \u0421\u043a\u043b\u0435\u0439\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438         combined_image = np.vstack((img1, img2))          return combined_image  def get_total_frames():     ''' \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435\u043e.         \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043e\u043d \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0434\u043a\u043e.         \u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439, \u043e\u043d \u0434\u043e\u043b\u0433\u0438\u0439, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e.     '''          cmd1 = [\"ffprobe\", \"-v\", \"error\", \"-select_streams\", \"v:0\", \"-show_entries\", \"stream=nb_frames\",             \"-of\", \"default=nokey=1:noprint_wrappers=1\", video_file]     cmd2 = [\"ffprobe\", \"-v\", \"error\", \"-select_streams\", \"v:0\", \"-show_entries\", \"stream=nb_read_frames\", \"-count_frames\",             \"-of\", \"default=nokey=1:noprint_wrappers=1\", video_file]          try:         result = subprocess.check_output(cmd1).splitlines()[0].decode().strip()         print(f\"\u0412\u0430\u0440\u0438\u0430\u043d\u04421: {result}\")         if result != \"N\/A\":             return int(result)     except Exception:         pass      try:         result = subprocess.check_output(cmd2).splitlines()[0].decode().strip()         print(f\"\u0412\u0430\u0440\u0438\u0430\u043d\u04422: {result}\")         if result != \"N\/A\":             return int(result)     except Exception:         pass              raise RuntimeError(\"\u041e\u0448\u0438\u0431\u043a\u0430, \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0440\u0435\u0439\u043c\u043e\u0432.\")   def extract_frames(start_frame, end_frame):     ''' \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u0445 \u043f\u043e \u0447\u0430\u043d\u043a\u0430\u043c \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 chunk_size '''          frames_to_process = end_frame - start_frame + 1     extracted_frames = []      with frame_counter.get_lock():         start_counter = frame_counter.value         frame_counter.value += frames_to_process      for chunk_start in range(start_frame, end_frame + 1, chunk_size):         chunk_end = min(chunk_start + chunk_size - 1, end_frame)         extract_frames_dir = os.path.join(frames_dir, f\"file_%06d.png\")          cmd = [             \"ffmpeg\", \"-hwaccel\", \"cuda\", \"-i\", video_file,             \"-vf\", f\"select='between(n,{chunk_start},{chunk_end})'\",             \"-vsync\", \"0\", \"-start_number\", str(chunk_start), extract_frames_dir         ]         subprocess.run(cmd, check=True)         print(cmd)          for i in range(chunk_end - chunk_start + 1):             frame_number = start_counter + i + (chunk_start - start_frame)             frame_path = extract_frames_dir % frame_number             extracted_frames.append(frame_path)                      return extracted_frames      def chunk_processing(extracted_frames):     ''' \u0421\u0442\u0430\u0440\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0447\u0430\u043d\u043a\u0430 '''          for frame_path in extracted_frames:              # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0438\u043c\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f 3D \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f         frame_name = os.path.splitext(os.path.basename(frame_path))[0]                  # \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f         image = cv2.imread(frame_path)                  # \u0420\u0430\u0437\u043c\u0435\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f         height, width = image.shape[:2]          # \u0417\u0430\u043f\u0443\u0441\u043a depth_processing \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b         depth = depth_processing(image)          # \u0417\u0430\u043f\u0443\u0441\u043a image3d_processing \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b         if PARALLAX_METHOD == 1:             left_image, right_image = image3d_processing_method1(image, depth, height, width)         elif PARALLAX_METHOD == 2:             left_image, right_image = image3d_processing_method2(image, depth, height, width)         else:             print(f\"\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 {PARALLAX_METHOD}.\")          # \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b \u0432 \u043e\u0431\u0449\u0435\u0435 3D \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435         image3d = image3d_combining(left_image, right_image, height, width)                  # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 3D \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f         output_image3d_path = os.path.join(images3d_dir, f'{frame_name}.jpg')         cv2.imwrite(output_image3d_path, image3d, [int(cv2.IMWRITE_JPEG_QUALITY), 100])         #cv2.imwrite(output_image3d_path, image3d) # \u0415\u0441\u043b\u0438 PNG          # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430         os.remove(frame_path)              with threads_count.get_lock():         threads_count.value = max(1, threads_count.value - 1) # \u0423\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430   def run_processing():     ''' \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438'''          # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435\u043e     total_frames = get_total_frames()                              # \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438     if total_frames:         with ThreadPoolExecutor(max_workers=max_threads) as executor:             futures = []             for start_frame in range(0, total_frames, chunk_size):                 while True:                     with threads_count.get_lock():                         if threads_count.value &lt; max_threads:                             threads_count.value += 1                             break                                                  time.sleep(5) # \u041f\u0430\u0443\u0437\u0430 \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432                  end_frame = min(start_frame + chunk_size - 1, total_frames - 1)                 extracted_frames = extract_frames(start_frame, end_frame)                 future = executor.submit(chunk_processing, extracted_frames)                 futures.append(future)                          # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447             for future in futures:                 future.result()   # \u0417\u0410\u041f\u0423\u0421\u041a \u041e\u0411\u0420\u0410\u0411\u041e\u0422\u041a\u0418 run_processing()  print(\"\u0413\u041e\u0422\u041e\u0412\u041e.\")   # \u041e\u0447\u0438\u0449\u0430\u0435\u043c Cuda del model_depth torch.cuda.empty_cache()<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e \u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0440\u0435\u0439\u043c\u043e\u0432. \u0422\u043e\u0447\u043d\u0435\u0435 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0435\u0441\u0442\u044c, \u043d\u043e \u043e\u043d\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 \u0432\u0438\u0434\u0435\u043e-\u0444\u0430\u0439\u043b\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0417\u0430 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 <strong>ffmpeg<\/strong>. \u0417\u0430\u0434\u0430\u0435\u043c <strong>chunk_size <\/strong>(\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u043d\u0430 \u043f\u043e\u0442\u043e\u043a) \u0438 <strong>max_threads<\/strong> (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432), \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0444\u0440\u0435\u0439\u043c\u044b \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>ffprobe<\/strong>. \u0412\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 (\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439) \u0441\u0442\u0430\u0442\u044c\u0435. \u041c\u043e\u0433\u0443 \u043b\u0438\u0448\u044c \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (<strong><em>AMD Ryzen 5 PRO 3600, 32Gb DDR4, RTX 3060 12GB<\/em><\/strong>) \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <strong>3-5<\/strong> \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e <strong>5000 <\/strong>\u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u043d\u0430 \u043f\u043e\u0442\u043e\u043a.<\/p>\n<p>\u0414\u043b\u044f \u0447\u0435\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f \u0441 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 (\u043f\u0441\u0435\u0432\u0434\u043e-\u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439)? \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u043e\u0432. \u041c\u044b \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<br \/><code>ffmpeg -hwaccel cuda -i video.mkv -vf \"select='between(n,5000,10000)'\" -vsync 0 -start_number 5000 \"extracted_frames\/file_%06d.png\"<\/code><\/p>\n<p>\u0437\u0430\u0442\u0435\u043c:<br \/><code>ffmpeg -hwaccel cuda -i \"video.mkv\" -vf \"select='between(n,10001,15000)'\" -vsync 0 -start_number 10001 \"extracted_frames\/file_%06d.png\"<\/code><\/p>\n<p>\u0438 \u0442\u0434.<\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e <strong>ffmpeg <\/strong>\u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u0430\u0434\u0440\u044b \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u043e\u0439 (\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435 \u043a\u0430\u0434\u0440\u044b), \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. \u042d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0435\u043a\u0430 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0423 \u043c\u0435\u043d\u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u043b\u044e\u0441\u0442\u0438 \u0442\u043e\u0447\u043d\u0443\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e (\u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430 \u0438\u043b\u0438 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0434\u0440\u043e\u0432), \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435, \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u044f \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044e \u0441\u043a\u0440\u0438\u043f\u0442.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/891\/7bd\/912\/8917bd9129e16911cdd7542775e65bd0.gif\" alt=\"C-3PO \u0432 \u043e\u0431\u044a\u0435\u043c\u0435\" title=\"C-3PO \u0432 \u043e\u0431\u044a\u0435\u043c\u0435\" width=\"1920\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/891\/7bd\/912\/8917bd9129e16911cdd7542775e65bd0.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/891\/7bd\/912\/8917bd9129e16911cdd7542775e65bd0.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>C-3PO \u0432 \u043e\u0431\u044a\u0435\u043c\u0435<\/figcaption><\/div>\n<\/figure>\n<p><u>\u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435:<\/u><br \/><code>ffmpeg -hwaccel cuda -i video.mkv -vf \"select='between(n,5000,10000)'\" -vsync 0 -start_number 5000 \"extracted_frames\/file_%06d.png\"<\/code><\/p>\n<p>&#171;-hwaccel cuda&#187; &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c CUDA \u0434\u043b\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438, \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 CPU<br \/>&#171;-i video.mkv&#187; &#8212; \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0432\u0438\u0434\u0435\u043e-\u0444\u0430\u0439\u043b<br \/>&#171;-vf &#171;select=&#8217;between(n,5000,10000)'&#187;&#187; &#8212; \u0444\u0438\u043b\u044c\u0442\u0440 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u043e\u0442 5000 \u0434\u043e 10000 \u0444\u0440\u0435\u0439\u043c\u0430<br \/>&#171;-vsync 0&#187; &#8212; \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043a\u0430\u043c, \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u044b \u043a\u0430\u043a \u0435\u0441\u0442\u044c<br \/>&#171;-start_number&#187; &#8212; \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0442 5000<br \/>&#171;&#187;extracted_frames\/file_%06d.png&#187;&#187; &#8212; \u043f\u0443\u0442\u044c \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u044b \u0438 \u043c\u0430\u0441\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432, \u0433\u0434\u0435 %06d &#8212; 6-\u0437\u043d\u0430\u0447\u043d\u044b\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a, \u0444\u0430\u0439\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0434\u0430 &#171;file_005000.png&#187;, &#171;file_005001.png&#187; \u0438 \u0442\u0434.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 &#171;\u0432\u0440\u0443\u0447\u043d\u0443\u044e&#187; \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u043c, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0435 \u0434\u043e\u0440\u043e\u0436\u043a\u0438 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.<br \/>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<br \/><code>ffmpeg -r 24000\/1001 -i \"frames_3d\/file_%06d.jpg\" -i video.mkv -c:v hevc_nvenc -b:v 20M -minrate 10M -maxrate 30M -bufsize 60M -preset p7 -map 0:v -map 1:a -c:a copy -pix_fmt yuv420p video_3d.mkv<\/code><\/p>\n<p><u>\u0417\u0434\u0435\u0441\u044c:<\/u><br \/>&#171;-r 24000\/1001&#187; &#8212; \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 (\u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435), 24000\/1001=23,976 \u043a\u0430\u0434\u0440\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443<br \/>&#171;-i &#171;frames_3d\/file_%06d.jpg&#187;&#187; &#8212; \u043f\u0430\u043f\u043a\u0430 \u0441 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u043c\u0438 \u0444\u0440\u0435\u0439\u043c\u0430\u043c\u0438<br \/>&#171;-i video.mkv&#187; &#8212; \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0432\u0438\u0434\u0435\u043e-\u0444\u0430\u0439\u043b \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0438\u0437 \u043d\u0435\u0433\u043e \u0430\u0443\u0434\u0438\u043e-\u0434\u043e\u0440\u043e\u0436\u0435\u043a<br \/>&#171;-c:v hevc_nvenc&#187; &#8212; \u043a\u043e\u0434\u0435\u043a, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u044f CUDA &#8212; HEVC H265(\u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e)<br \/>&#171;-b:v 20M -minrate 10M -maxrate 30M&#187; &#8212; \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0431\u0438\u0442\u0440\u0435\u0439\u0442, \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 20\u041c\u0431\u0438\u0442\/\u0441\u0435\u043a, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 10\u041c\u0431\u0438\u0442\/\u0441\u0435\u043a, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 30\u041c\u0431\u0438\u0442\/\u0441\u0435\u043a<br \/>&#171;-bufsize 60M&#187; &#8212; \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 2x \u043e\u0442 maxrate (2x30M=60M), \u043b\u0438\u0431\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 ffmpeg<br \/>&#171;-preset p7&#187; &#8212; \u043f\u0440\u0435\u0441\u0435\u0442 7 \u0434\u043b\u044f \u043a\u043e\u0434\u0435\u043a\u0430 hevc_nvenc, \u0432\u044b\u0441\u043e\u043a\u043e\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e<br \/>&#171;-map 0:v&#187; &#8212; \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0441 \u0444\u0440\u0435\u0439\u043c\u0430\u043c\u0438 \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0435\u043e\u0440\u044f\u0434\u0430<br \/>&#171;-map 1:a -c:a copy&#187; &#8212; \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0443\u0434\u0438\u043e-\u0434\u043e\u0440\u043e\u0436\u043a\u0438 \u0438\u0437 &#171;-i video.mkv&#187; \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, &#171;-c:a copy&#187; &#8212; \u043f\u0440\u044f\u043c\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<br \/>&#171;-pix_fmt yuv420p&#187; &#8212; \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0432\u0438\u0434\u0435\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c yuv420p<br \/>&#171;video_3d.mkv&#187; &#8212; \u0438\u043c\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430<\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430 \u0430\u0432\u0442\u043e\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0440\u0435\u0439\u043c\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">compile_video3d = [ \"ffmpeg\", \"-r\", \"24000\/1001\", \"-i\", \"frames_3d\/file_%06d.jpg\", \"-i\", \"video.mkv\", \"-c:v\", \"hevc_nvenc\", \"-b:v\", \"20M\", \"-minrate\", \"10M\", \"-maxrate\", \"30M\", \"-bufsize\", \"60M\", \"-preset\", \"p7\", \"-map\", \"0:v\", \"-map\", \"1:a\", \"-c:a\", \"copy\", \"-pix_fmt\", \"yuv420p\", \"video_3d.mkv\" ]  subprocess.run(compile_video3d, check=True)<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041b\u0438\u0447\u043d\u043e \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0442.\u043a. \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0443\u0431\u0438\u0440\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u0430\u0443\u0434\u0438\u043e-\u0434\u043e\u0440\u043e\u0436\u0435\u043a, \u0438\u043b\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043a\u043e\u0434\u0435\u043a\u0430\u043c\u0438, \u0444\u0440\u0435\u0439\u043c\u0440\u0435\u0439\u0442\u043e\u043c \u0438 \u0447\u0435\u043c \u0443\u0433\u043e\u0434\u043d\u043e \u0435\u0449\u0435.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0444\u0440\u0435\u0439\u043c\u0430\u043c\u0438.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dfe\/024\/a9e\/dfe024a9ec34be99242b259a2a40e5f2.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0430\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0430\" width=\"1920\" height=\"816\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/dfe\/024\/a9e\/dfe024a9ec34be99242b259a2a40e5f2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dfe\/024\/a9e\/dfe024a9ec34be99242b259a2a40e5f2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u041d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430<\/h3>\n<p>\u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0445 \u0434\u0432\u0435:<br \/><strong>image3d_processing_method1<\/strong><br \/><strong>image3d_processing_method2<\/strong><\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0438 \u0441 \u0431\u043e\u043b\u0435\u0435 \u043c\u044f\u0433\u043a\u0438\u043c \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u0445. \u0412\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443, 3D \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u043c. \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e 3D-\u043e\u0431\u044a\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0430 \u043c\u0435\u0442\u043e\u0434\u0430, \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438, \u043d\u043e \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0435\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f. \u0412\u044b\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <strong>PARALLAX_METHOD<\/strong>, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b 2 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430: <strong>1<\/strong> \u0438 <strong>2<\/strong> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>\u041f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 &#8212; <strong>INPAINT_RADIUS<\/strong>. \u042d\u0442\u043e \u0440\u0430\u0434\u0438\u0443\u0441 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 (<strong>image3d_processing_method2<\/strong>). \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u043d\u0430 \u043a\u0440\u0430\u044f\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u0438\u0445 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0438. \u0422\u043e \u0435\u0441\u0442\u044c, \u044d\u0442\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u043d\u043e\u0439 \u0440\u0430\u043c\u043a\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u0447\u0435\u0440\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 <strong>2<\/strong> \u0434\u043e <strong>5<\/strong>, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <strong>2-3<\/strong>. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <strong>INPAINT_RADIUS = 15<\/strong>, \u0442\u043e\u0433\u0434\u0430 \u043a\u0440\u0430\u044f \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0440\u0430\u0437\u043c\u044b\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c <strong>0<\/strong> \u0438\u043b\u0438 <strong>1<\/strong>, \u0442\u043e\u0433\u0434\u0430 \u0440\u0430\u043c\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0440\u0435\u0437\u043a\u043e\u0439 \u0438 \u043d\u0435 \u0442\u043e\u0447\u043d\u043e\u0439. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <strong>2<\/strong> \u0438\u043b\u0438 <strong>3<\/strong> \u043f\u0438\u043a\u0441\u0435\u043b\u044f.<\/p>\n<p>\u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/897860\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>, \u043d\u0435 \u0431\u0443\u0434\u0443 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8e8\/d3c\/1e9\/8e8d3c1e9ff137d71bc848a9f17ed668.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0430\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0430\" width=\"1920\" height=\"816\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/8e8\/d3c\/1e9\/8e8d3c1e9ff137d71bc848a9f17ed668.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8e8\/d3c\/1e9\/8e8d3c1e9ff137d71bc848a9f17ed668.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u0414\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<h4>VapourSynth<\/h4>\n<p>\u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0441\u0442\u0430\u0442\u044c\u044f\u043c \u043c\u043d\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0430\u0440\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u043c\u0435\u0441\u0442\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0438: \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 -&gt; \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 -&gt; \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0438\u0437 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0432\u0438\u0434\u0435\u043e, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0438\u0434\u0435\u043e \u043d\u0430 \u043b\u0435\u0442\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <strong>VapourSynth<\/strong>. \u0421\u0445\u0435\u043c\u0430 \u0442\u0430\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c: ffmpeg \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0444\u0440\u0435\u0439\u043c, \u0441\u0440\u0430\u0437\u0443 (\u0431\u0435\u0437 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f) \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f 3D-\u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u0430\u0434\u0440\u0430), \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0434\u0435\u043e-\u0444\u0430\u0439\u043b (\u0442\u043e\u0447\u043d\u0435\u0435 \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0432\u0441\u0442\u0430\u0435\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435). \u0412\u0441\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 <strong>RAM \/ VRAM<\/strong>, \u043c\u0438\u043d\u0443\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u0434\u0440\u043e\u0432 \u043d\u0430 \u0436\u0435\u0441\u0442\u043a\u0438\u0439 \u0434\u0438\u0441\u043a.<\/p>\n<p>\u042f \u043f\u043e\u043a\u0430 \u043d\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0441 \u044d\u0442\u0438\u043c. \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0423\u0431\u0443\u043d\u0442\u0443, \u043d\u043e VapourSynth \u0441\u0442\u0430\u043b \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 ffmpeg \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (<strong>apt update<\/strong> \u043d\u0435 \u043f\u043e\u043c\u043e\u0433, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e). \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 ffmpeg (\u0445\u043e\u0442\u044f \u043b\u0438\u0447\u043d\u043e \u043c\u0435\u043d\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439), \u0438 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043d\u043e VapourSynth \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0441\u0442\u0438. \u041f\u043e\u0437\u0436\u0435 \u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0441\u044c \u043a \u044d\u0442\u043e\u043c\u0443, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434 <strong>Windows <\/strong>\u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435.<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 \u043b\u0435\u0442\u0443<\/strong>. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u043c\u0430 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 <strong>Depth-Anything-V2 Large<\/strong> \u043c\u043e\u0436\u0435\u0442 \u0434\u043b\u0438\u0442\u044c\u0441\u044f <strong>\u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0443\u0442\u043e\u043a<\/strong>, \u0430 \u0442\u043e \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e. \u042f \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u043c\u0430 StarWars4 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 FullHD \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e 2 \u0447\u0430\u0441\u0430 4 \u043c\u0438\u043d\u0443\u0442\u044b \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/897860\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u041d\u0430 \u043c\u043e\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (<strong><em>AMD Ryzen 5 PRO 3600, 32Gb DDR4, RTX 3060 12GB<\/em><\/strong>) \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e <strong>Large <\/strong>\u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0440\u044f\u0434\u043a\u0430 <strong>32 \u0447\u0430\u0441\u043e\u0432<\/strong> \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u043c\u0430, \u0438 \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0441\u0431\u043e\u0439 \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 &#8212; \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0432\u0441\u0435 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/de7\/394\/e2f\/de7394e2fa41ca285dca8f6b6ab46d40.gif\" alt=\"\u0414\u0430\u0440\u0442 \u0412\u0435\u0439\u0434\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0443\u0448\u043a\u0430\" title=\"\u0414\u0430\u0440\u0442 \u0412\u0435\u0439\u0434\u0435\u0440 \u043d\u0435 \u0441\u0442\u0435\u0440\u043f\u0435\u043b \u0431\u044b \u044d\u0442\u043e\u0433\u043e\" width=\"1920\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/de7\/394\/e2f\/de7394e2fa41ca285dca8f6b6ab46d40.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/de7\/394\/e2f\/de7394e2fa41ca285dca8f6b6ab46d40.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0430\u0440\u0442 \u0412\u0435\u0439\u0434\u0435\u0440 \u043d\u0435 \u0441\u0442\u0435\u0440\u043f\u0435\u043b \u0431\u044b \u044d\u0442\u043e\u0433\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u041d\u0430\u0434\u043e \u0431\u044b\u0442\u044c \u0442\u043e\u0447\u043d\u043e \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e \u0430\u043f\u0441\u043a\u0435\u0439\u043b \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0438\u0434\u0435\u043e (<a href=\"https:\/\/habr.com\/ru\/articles\/904784\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/articles\/904784\/<\/a>) \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043b, \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u043e <strong>DVD-MPEG2<\/strong> \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u0437 <s>\u044e\u0440\u0441\u043a\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430<\/s> \u0442\u043e\u0439 \u044d\u043f\u043e\u0445\u0438. \u0422\u0430\u043c \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0442\u043e\u0447\u043d\u044b\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u0430\u0434\u0440\u043e\u0432, \u0441 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0447\u0435\u043c \u0443\u0433\u043e\u0434\u043d\u043e \u0435\u0449\u0435. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438 \u0442\u043e, \u0447\u0442\u043e \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435.<\/p>\n<p>\u0410 \u0442\u0430\u043a, \u0432 \u0446\u0435\u043b\u043e\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0435\u0437 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0440\u0435\u0439\u043c\u043e\u0432 &#8212; \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0434\u0435\u044f, \u0432\u0435\u0434\u044c \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0434 \u0444\u0440\u0435\u0439\u043c\u044b \u043d\u0430 \u0434\u0438\u0441\u043a\u0435, \u0430 \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c <strong>4K <\/strong>\u0438 <strong>PNG<\/strong>, \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<h4>\u0414\u0440\u0443\u0433\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 2D -&gt; 3D<\/h4>\n<p>\u041a \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:<br \/><a href=\"https:\/\/github.com\/nagadomi\/nunif\/tree\/master\/iw3\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/nagadomi\/nunif\/tree\/master\/iw3<\/a><\/p>\n<p>\u042f \u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b, \u043b\u0438\u0448\u044c \u0431\u0435\u0433\u043b\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b. \u0422\u0430\u043c \u0435\u0441\u0442\u044c GUI \u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a. \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0433\u043b\u0443\u0431\u0438\u043d\u044b, \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u043d\u0430\u0433\u043b\u0438\u0444\u0430 \u0438 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0435\u0449\u0435. \u041f\u043e\u0436\u0430\u043b\u0443\u0439 \u0432 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f.<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0417\u0430 \u0441\u0438\u043c \u044f \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0431\u0443\u0434\u0443 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c \u0441 \u0441\u0435\u0440\u0438\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043f\u043e \u0442\u0435\u043c\u0435 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0432\u0438\u0434\u0435\u043e \u0438\u0437 2D \u0432 3D. \u0415\u0449\u0435 \u0440\u0430\u0437 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e:<br \/><a href=\"https:\/\/habr.com\/ru\/articles\/897860\/\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c 3D \u0432\u0435\u0440\u0441\u0438\u044e \u043b\u044e\u0431\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u043c\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 StarWars4 (DepthAnythingV2 + Parallax)<\/a><a href=\"https:\/\/habr.com\/ru\/articles\/897860\/)%EF%BF%BC\" rel=\"noopener noreferrer nofollow\"><br \/><\/a>\u0422\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e &#8212; \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0442\u0434.<\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442\u044b \u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e, \u0437\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0442\u0443\u0442:<br \/><a href=\"https:\/\/github.com\/peterplv\/MakeAnythingStereo3D\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/peterplv\/MakeAnythingStereo3D<\/a>, \u043b\u0438\u0431\u043e \u0432 \u0422\u0433-\u043a\u0430\u043d\u0430\u043b\u0435 (<a href=\"https:\/\/t.me\/peter_touch_ai\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/peter_touch_ai<\/a>).<\/p>\n<p>\u041d\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u0435\u043b\u044c, \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043e\u043a\u043e\u043b\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0430 \u0444\u0438\u043b\u044c\u043c\u043e\u0432 \u0432 3D (\u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c).<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 &#171;\u043e\u0442\u0434\u043e\u0445\u043d\u0443\u0442\u044c&#187;, \u043e\u0442\u0432\u043b\u0435\u0447\u044c\u0441\u044f \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (LLM, RAG\u0438, \u0430\u0433\u0435\u043d\u0442\u044b \u0438 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445), \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0447\u0442\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 &#171;\u043b\u0435\u0433\u043a\u043e\u0435&#187; \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043e\u0442\u0434\u044b\u0445 \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0443\u0441\u043b\u043e \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c 2 pet-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 &#8212; \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044e \u0432\u0438\u0434\u0435\u043e 2D -&gt; 3D, \u0438 \u0430\u043f\u0441\u043a\u0435\u0439\u043b \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0438\u0434\u0435\u043e (<a href=\"https:\/\/habr.com\/ru\/articles\/904784\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0431 \u044d\u0442\u043e\u043c<\/a>). \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0433\u043b\u0443\u0431\u0436\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c\u044b\u0439 ffmpeg, \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0432\u0438\u0434\u0435\u043e, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043d\u0435\u0439\u0440\u043e\u043d\u043e\u043a, \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430 \u0438 \u0442\u0434 \u0442\u0434. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043e\u0442\u0434\u044b\u0445 \ud83d\ude42<\/p>\n<p>\u0411\u0443\u0434\u0443 \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u0435\u043b\u0435\u043d, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u043b\u0430\u0439\u043a \u0437\u0430 \u0441\u0442\u0430\u0440\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043e \u043f\u0440\u0438\u0431\u0443\u0434\u0435\u0442 \u0441 \u0432\u0430\u043c\u0438 \u0441\u0438\u043b\u0430.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a8e\/7b6\/bfa\/a8e7b6bfa3db4e46dbe81a8206c479fa.gif\" alt=\"\u0427\u0443\u0432\u0438 \u0438 \u0425\u0430\u043d \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f\u0442 \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\" title=\"\u0427\u0443\u0432\u0438 \u0438 \u0425\u0430\u043d \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f\u0442 \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\" width=\"1920\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a8e\/7b6\/bfa\/a8e7b6bfa3db4e46dbe81a8206c479fa.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a8e\/7b6\/bfa\/a8e7b6bfa3db4e46dbe81a8206c479fa.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0427\u0443\u0432\u0438 \u0438 \u0425\u0430\u043d \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f\u0442 \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/906612\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043b\u0438 \u0432\u044b 3D?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">37.5% <\/span><span class=\"tm-article-poll__answer-label\">\u0414\u0430, \u043b\u044e\u0431\u043b\u044e 3D<\/span><span class=\"tm-article-poll__answer-votes\">6<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 37.5%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">18.75% <\/span><span class=\"tm-article-poll__answer-label\">\u0420\u0435\u0434\u043a\u043e, \u043d\u043e \u043b\u044e\u0431\u043b\u044e 3D<\/span><span class=\"tm-article-poll__answer-votes\">3<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 18.75%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">18.75% <\/span><span class=\"tm-article-poll__answer-label\">\u041c\u043d\u0435 \u0431\u0435\u0437\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e 3D, \u043d\u043e \u043c\u043e\u0433\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c<\/span><span class=\"tm-article-poll__answer-votes\">3<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 18.75%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">25% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044e<\/span><span class=\"tm-article-poll__answer-votes\">4<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 25%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 16 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0441\u044f 1 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/906612\/\"> https:\/\/habr.com\/ru\/articles\/906612\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438:<br \/><strong><em>\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c 3D \u0432\u0435\u0440\u0441\u0438\u044e \u043b\u044e\u0431\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u043c\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 StarWars4 (DepthAnythingV2 + Parallax)<\/em><\/strong> (<a href=\"https:\/\/habr.com\/ru\/articles\/897860\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/articles\/897860\/<\/a>)<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439, \u0442\u0430\u043c \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438: \u0441\u0443\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u043d\u0438\u0445. \u0422\u0430\u043a\u0436\u0435 \u0442\u0430\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 3D \u0432\u0438\u0434\u0435\u043e (\u043e\u0442\u0440\u044b\u0432\u043e\u043a StarWars4), \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u043b\u044f VR. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u043d\u0435\u043c\u0443. \u0422\u0430\u043a\u0436\u0435 \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0432\u0438\u0434\u0435\u043e \u0438\u0437 2D \u0432 3D.<\/p>\n<p>\u041f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 3D-\u0433\u0438\u0444\u044b, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <strong>DepthAnythingV2 <\/strong>+ <strong>Parallax<em>.<\/em><\/strong><\/p>\n<h3>\u041d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442<\/h3>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u0438\u043f\u0442:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import os import subprocess from threading import Lock from concurrent.futures import ThreadPoolExecutor from multiprocessing import Value import cv2 import torch import numpy as np  from depth_anything_v2.dpt import DepthAnythingV2   # \u041f\u0410\u0420\u0410\u041c\u0415\u0422\u0420\u042b \u041e\u0411\u0429\u0418\u0415 # \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0444\u0430\u0439\u043b video_file = \"\/home\/user\/video.mkv\" video_name = os.path.splitext(os.path.basename(video_file))[0]  # \u041f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0438 \u043f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0445 3D \u0444\u0440\u0435\u0439\u043c\u043e\u0432 frames_dir = os.path.join(os.path.dirname(video_file), f\"{video_name}_frames\") images3d_dir = os.path.join(os.path.dirname(video_file), f\"{video_name}_3d\") os.makedirs(frames_dir, exist_ok=True) os.makedirs(images3d_dir, exist_ok=True)  frame_counter = Value('i', 0) # \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0434\u0440\u043e\u0432 threads_count = Value('i', 0) # \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b max_threads  chunk_size = 5000  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a max_threads = 3 # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432  # \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 device = torch.device('cuda')   # \u041f\u0410\u0420\u0410\u041c\u0415\u0422\u0420\u042b 3D PARALLAX_SCALE = 15  # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 10 \u0434\u043e 20 PARALLAX_METHOD = 2  # 1 \u0438\u043b\u0438 2 INPAINT_RADIUS = 2  # \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 2 \u0434\u043e 5, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 2-3 INTERPOLATION_TYPE = cv2.INTER_LINEAR TYPE3D = \"FSBS\"  # HSBS, FSBS, HOU, FOU LEFT_RIGHT = \"LEFT\"  # LEFT or RIGHT  # 0 - \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f new_width = 1920 new_height = 1080  # \u041f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u0441\u043b\u0435\u0448\u0430 \u043d\u0430 \u043a\u043e\u043d\u0446\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \"\/home\/user\/DepthAnythingV2\/models\" depth_model_dir = \"\/home\/user\/DepthAnythingV2\/models\"  model_depth_configs = {         'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},         'vitb': {'encoder': 'vitb', 'features': 128, 'out_channels': [96, 192, 384, 768]},         'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]} }  encoder = 'vitl' # 'vitl', 'vitb', 'vits'  model_depth = DepthAnythingV2(**model_depth_configs[encoder]) model_depth.load_state_dict(torch.load(f'{depth_model_dir}\/depth_anything_v2_{encoder}.pth', weights_only=True, map_location=device)) model_depth = model_depth.to(device).eval()    def image_size_correction(current_height, current_width, left_image, right_image):     ''' \u041a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u044b new_width \u0438 new_height '''          # \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f     top = (new_height - current_height) \/\/ 2     left = (new_width - current_width) \/\/ 2          # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0447\u0435\u0440\u043d\u044b\u0439 \u0445\u043e\u043b\u0441\u0442 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430     new_left_image = np.zeros((new_height, new_width, 3), dtype=np.uint8)     new_right_image = np.zeros((new_height, new_width, 3), dtype=np.uint8)          # \u0420\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0447\u0435\u0440\u043d\u043e\u043c \u0444\u043e\u043d\u0435     new_left_image[top:top + current_height, left:left + current_width] = left_image     new_right_image[top:top + current_height, left:left + current_width] = right_image          return new_left_image, new_right_image              def depth_processing(image):     ''' \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0434\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f '''          # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0433\u043b\u0443\u0431\u0438\u043d\u044b     with torch.no_grad():         depth = model_depth.infer_image(image)              # \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b     depth_normalized = (depth - depth.min()) \/ (depth.max() - depth.min())      return depth_normalized  def image3d_processing_method1(image, depth, height, width):     ''' \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b.         \u041c\u0435\u0442\u043e\u04341: \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0439, \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u0431\u043e\u043b\u0435\u0435 \u0441\u0433\u043b\u0430\u0436\u0435\u043d\u043d\u044b\u0435, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u043d\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u043c     '''          # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430     parallax = depth * PARALLAX_SCALE          # \u0421\u0435\u0442\u043a\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442     y, x = np.indices((height, width), dtype=np.float32)      # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439     shift_left = np.clip(x - parallax, 0, width - 1)     shift_right = np.clip(x + parallax, 0, width - 1)      # \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0441 cv2.remap     left_image = cv2.remap(image, shift_left, y, interpolation=INTERPOLATION_TYPE)     right_image = cv2.remap(image, shift_right, y, interpolation=INTERPOLATION_TYPE)      return left_image, right_image      def image3d_processing_method2(image, depth, height, width):     ''' \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d\u044b.         \u041c\u0435\u0442\u043e\u04342: \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u0447\u043d\u0435\u0435.     '''          # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430     parallax = depth * PARALLAX_SCALE          # \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 int32     shift = np.round(parallax).astype(np.int32)      # \u0421\u0435\u0442\u043a\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442     y, x = np.indices((height, width))      # \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439     left_image  = np.zeros_like(image)     right_image = np.zeros_like(image)      # \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c     x_src_left = x - shift     valid_left = (x_src_left &gt;= 0) &amp; (x_src_left &lt; width)     left_image[y[valid_left], x[valid_left]] = image[y[valid_left], x_src_left[valid_left]]      # \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c     x_src_right = x + shift     valid_right = (x_src_right &gt;= 0) &amp; (x_src_right &lt; width)     right_image[y[valid_right], x[valid_right]] = image[y[valid_right], x_src_right[valid_right]]          # \u041c\u0430\u0441\u043a\u0438 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u0438\u043d\u043f\u0435\u0439\u043d\u0442\u0438\u043d\u0433\u0430     mask_left  = (~valid_left).astype(np.uint8) * 255     mask_right = (~valid_right).astype(np.uint8) * 255      # \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0443\u0441\u0442\u043e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u043f\u0435\u0439\u043d\u0442\u0438\u043d\u0433     left_image  = cv2.inpaint(left_image,  mask_left,  INPAINT_RADIUS,  cv2.INPAINT_TELEA)     right_image = cv2.inpaint(right_image, mask_right, INPAINT_RADIUS, cv2.INPAINT_TELEA)      return left_image, right_image      def image3d_combining(left_image, right_image, height, width):        ''' \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b \u0432 \u0435\u0434\u0438\u043d\u043e\u0435 3D \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 '''          # \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u044b new_width \u0438 new_height     if new_width and new_height:         left_image, right_image = image_size_correction(height, width, left_image, right_image)         # \u041c\u0435\u043d\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 new_height \u0438 new_width \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0438\u0436\u0435         height = new_height         width = new_width              # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0438\u043b\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435     img1, img2 = (left_image, right_image) if LEFT_RIGHT == \"LEFT\" else (right_image, left_image)          # \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0435\u0434\u0438\u043d\u043e\u0435 3D \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435     if TYPE3D == \"HSBS\":  # \u0421\u0443\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043a\u043b\u0435\u0439\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438         combined_image = np.hstack((cv2.resize(img1, (width \/\/ 2, height), interpolation=cv2.INTER_AREA),                           cv2.resize(img2, (width \/\/ 2, height), interpolation=cv2.INTER_AREA)))                                elif TYPE3D == \"HOU\":  # \u0421\u0443\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043a\u043b\u0435\u0439\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438         combined_image = np.vstack((cv2.resize(img1, (width, height \/\/ 2), interpolation=cv2.INTER_AREA),                           cv2.resize(img2, (width, height \/\/ 2), interpolation=cv2.INTER_AREA)))                                elif TYPE3D == \"FSBS\":  # \u0421\u043a\u043b\u0435\u0439\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438         combined_image = np.hstack((img1, img2))          elif TYPE3D == \"FOU\":  # \u0421\u043a\u043b\u0435\u0439\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438         combined_image = np.vstack((img1, img2))          return combined_image  def get_total_frames():     ''' \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435\u043e.         \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043e\u043d \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0434\u043a\u043e.         \u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439, \u043e\u043d \u0434\u043e\u043b\u0433\u0438\u0439, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e.     '''          cmd1 = [\"ffprobe\", \"-v\", \"error\", \"-select_streams\", \"v:0\", \"-show_entries\", \"stream=nb_frames\",             \"-of\", \"default=nokey=1:noprint_wrappers=1\", video_file]     cmd2 = [\"ffprobe\", \"-v\", \"error\", \"-select_streams\", \"v:0\", \"-show_entries\", \"stream=nb_read_frames\", \"-count_frames\",             \"-of\", \"default=nokey=1:noprint_wrappers=1\", video_file]          try:         result = subprocess.check_output(cmd1).splitlines()[0].decode().strip()         print(f\"\u0412\u0430\u0440\u0438\u0430\u043d\u04421: {result}\")         if result != \"N\/A\":             return int(result)     except Exception:         pass      try:         result = subprocess.check_output(cmd2).splitlines()[0].decode().strip()         print(f\"\u0412\u0430\u0440\u0438\u0430\u043d\u04422: {result}\")         if result != \"N\/A\":             return int(result)     except Exception:         pass              raise RuntimeError(\"\u041e\u0448\u0438\u0431\u043a\u0430, \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0440\u0435\u0439\u043c\u043e\u0432.\")   def extract_frames(start_frame, end_frame):     ''' \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0438<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-458554","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/458554","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=458554"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/458554\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=458554"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=458554"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=458554"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}