Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.174] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте.
Есть скрипт на питоне, который делает: - Оформление конспекта в разметку (формат) Notion. - Добавление в конспект изображений / скриншотов видео рядом с временными метками тезисов. Скрипт работает. Но при работе выводит сообщения о обшибках. На результат не влияет, но хотел бы убрать. Подскажите как сделать (или отредактируйте код)? import cv2 import requests import os import re # Функция для извлечения кадра из видео def extract_frame(video_path, timestamp, output_image_path): cap = cv2.VideoCapture(video_path) if not cap.isOpened(): raise Exception("Не удалось открыть видеофайл.") fps = cap.get(cv2.CAP_PROP_FPS) frame_number = int(fps * timestamp) cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number) ret, frame = cap.read() if ret: cv2.imwrite(output_image_path, frame) print(f"Изображение сохранено в {output_image_path}") else: raise Exception("Не удалось извлечь кадр из видео.") cap.release() # Функция для добавления временной метки на изображение (в правый нижний угол) def add_timestamp_to_image(image_path, timestamp): image = cv2.imread(image_path) if image is None: raise Exception(f"Не удалось загрузить изображение по пути: {image_path}") # Форматирование временной метки (без миллисекунд) formatted_timestamp = "{:02}:{:02}:{:02}".format(int(timestamp // 3600), int((timestamp % 3600) // 60), int(timestamp % 60)) # Параметры текста font = cv2.FONT_HERSHEY_SIMPLEX font_scale = 1 font_color = (0, 0, 0) # Черный цвет текста thickness = 2 line_type = cv2.LINE_AA # Позиция текста в правом нижнем углу (text_width, text_height), baseline = cv2.getTextSize(formatted_timestamp, font, font_scale, thickness) position = (image.shape[1] - text_width - 10, image.shape[0] - text_height - 10) # Нанесение текста на изображение cv2.putText(image, formatted_timestamp, position, font, font_scale, font_color, thickness, line_type) # Сохранение изображения с временной меткой output_image_with_timestamp = image_path.replace(".jpg", "_with_timestamp.jpg") cv2.imwrite(output_image_with_timestamp, image) return output_image_with_timestamp # Функция для загрузки изображения на Imageban def upload_to_imageban(image_path, secret_key): url = "https://api.imageban.ru/v1" headers = { 'Authorization': f'Bearer {secret_key}' } with open(image_path, 'rb') as image_file: files = {'image': image_file} response = requests.post(url, headers=headers, files=files) if response.status_code == 200: data = response.json() if data.get('success'): return data['data']['link'] else: raise Exception("Не удалось получить ссылку на изображение.") else: raise Exception(f"Ошибка при загрузке изображения: {response.status_code} - {response.text}") # Функция для преобразования временной метки в секунды def time_to_seconds(time_str): hours, minutes, seconds_milliseconds = time_str.split(':') minutes, seconds_milliseconds = minutes, seconds_milliseconds.replace(',', '.') seconds, milliseconds = seconds_milliseconds.split('.') total_seconds = int(hours) * 3600 + int(minutes) * 60 + float(seconds) + float(milliseconds) / 1000 return total_seconds # Текст конспекта text = """ <details><summary><strong>1. Введение</strong></summary> - **Запуск проекта**: Проект официально запущен, инициирующий документ составлен, подписан и опубликован. [00:00:00,000 --> 00:00:08,099] - **Назначение руководителя проекта**: Если вас назначили руководителем проекта, вам нужно принять эту роль и ответственность. [00:00:08,099 --> 00:00:13,140] </details> <details><summary><strong>2. Принятие ответственности</strong></summary> - **Роль руководителя проекта**: Теперь вы несете ответственность за весь проект. Важно осознать это и начать предпринимать конкретные действия по управлению проектом. [00:00:14,119 --> 00:00:20,980] - **Действия руководителя**: - Определение круга заинтересованных лиц проекта. [00:00:20,980 --> 00:00:29,199] </details> <details><summary><strong>3. Определение заинтересованных лиц</strong></summary> - **Кто такие заинтересованные лица?**: 1. **Люди или организации, которые могут повлиять на результаты проекта или на проект в целом**. 2. **Люди или организации, на кого результаты проекта или сам проект могут повлиять**. 3. **Те, кто считает, что проект или его результаты могут на них повлиять**. [00:00:29,199 --> 00:01:09,599] - **Пример: Проект "Свадьба"**: - Заинтересованные лица: жених, невеста, родители жениха и невесты. [00:01:18,459 --> 00:01:32,459] - **Задачи руководителя проекта**: 1. Встретиться с заинтересованными лицами и выяснить возможный круг всех заинтересованных сторон проекта. [00:01:38,900 --> 00:01:48,359] 2. В результате встречи можно выявить дополнительные заинтересованные стороны: - Начальники жениха и невесты. - Про бабушка жениха. - Компания по прокату свадебных лимузинов. - ЗАГС. [00:01:48,359 --> 00:02:39,520] </details> <details><summary><strong>4. Ключевые заинтересованные стороны в компании</strong></summary> - **Основные заинтересованные стороны проекта в организации**: 1. Руководитель проекта. 2. Куратор проекта. 3. Заказчик проекта. 4. Проектный офис. 5. Команда проекта. 6. Команда управления проектом. [00:02:39,520 --> 00:03:07,960] - **Значение влияния**: - Влияние заинтересованных сторон на достижение результатов проекта. - Определение требований заинтересованных сторон для нивелирования их негативного влияния на успешность проекта. [00:03:07,960 --> 00:03:34,200] </details> <details><summary><strong>5. Широкий круг заинтересованных сторон</strong></summary> - **Дополнительные заинтересованные стороны**: - Пользователи продукта. - Конкуренты. - Управляющий комитет проекта. [00:04:00,259 --> 00:04:26,519] - **Итог**: Список заинтересованных сторон можно увидеть на соответствующем слайде. [00:04:23,899 --> 00:04:26,519] </details> """ # Регулярное выражение для извлечения временных меток pattern = r'\[(\d{2}:\d{2}:\d{2},\d{3}) --> (\d{2}:\d{2}:\d{2},\d{3})\]' matches = re.findall(pattern, text) # Создаем словарь временных меток и файлов изображений timestamps = {} image_counter = 1 for start, end in matches: timestamp = f"{start} --> {end}" image_filename = f"image{image_counter}.jpg" timestamps[timestamp] = image_filename image_counter += 1 # Путь к папке для сохранения изображений image_folder = '/content/images/' os.makedirs(image_folder, exist_ok=True) # Задаем параметры video_path = '/content/drive/My Drive/Google Colaboratory/Файлы для Whisper AI/1.4.1.1 Инициация проекта. Модуль Определение заинтересованных сторон проекта.mp4' secret_key = '2tNBojRYkW4Nbj588bZr8ZPGmY9dM7vUvY0' # Извлечение кадров, добавление меток и загрузка на Imageban image_links = {} for timestamp, image_filename in timestamps.items(): try: start_time_str = timestamp.split(' --> ')[0] total_seconds = time_to_seconds(start_time_str) image_path = os.path.join(image_folder, image_filename) extract_frame(video_path, total_seconds, image_path) image_with_timestamp = add_timestamp_to_image(image_path, total_seconds) image_link = upload_to_imageban(image_with_timestamp, secret_key) image_links[timestamp] = image_link # Отображение изображения с временной меткой img = cv2.imread(image_with_timestamp) cv2.imshow(f"Image with Timestamp: {timestamp}", img) cv2.waitKey(0) cv2.destroyAllWindows() except Exception as e: print(f"Ошибка для временной метки {timestamp}: {e}") # Замена временных меток на ссылки в тексте for timestamp, link in image_links.items(): formatted_link = f"[{timestamp}] ![{timestamp}]({link})" text = text.replace(f"[{timestamp}]", formatted_link) print("Обновленный текст с ссылками на изображения:") print(text) |