|
|
import cv2
|
|
|
import os
|
|
|
import sys
|
|
|
import time
|
|
|
from pathlib import Path
|
|
|
from camera import create_camera
|
|
|
|
|
|
def capture_photo(output_dir='captured', camera):
|
|
|
"""
|
|
|
Простой инструмент для захвата фото с камеры.
|
|
|
При нажатии 's' запускается отсчёт 3 секунды, затем делается снимок.
|
|
|
При нажатии 'q' выход.
|
|
|
"""
|
|
|
# Создаём папку, если её нет
|
|
|
Path(output_dir).mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
cap = cv2.VideoCapture(camera_id)
|
|
|
if not cap.isOpened():
|
|
|
print("Не удалось открыть камеру")
|
|
|
sys.exit(1)
|
|
|
|
|
|
print("Нажмите 's' для захвата фото (отсчёт 3 секунды)")
|
|
|
print("Нажмите 'q' для выхода")
|
|
|
|
|
|
capture_count = 0
|
|
|
countdown = 0
|
|
|
countdown_start = 0
|
|
|
|
|
|
while True:
|
|
|
frame = camera.get_frame()
|
|
|
if frame is None:
|
|
|
continue
|
|
|
|
|
|
display = frame.copy()
|
|
|
|
|
|
# Отображение отсчёта, если активен
|
|
|
if countdown > 0:
|
|
|
elapsed = time.time() - countdown_start
|
|
|
remaining = max(0, 3 - elapsed)
|
|
|
if remaining > 0:
|
|
|
cv2.putText(display, f"Capturing in {int(remaining)}", (display.shape[1]//2-100, display.shape[0]//2),
|
|
|
cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
|
|
|
else:
|
|
|
# Сохраняем фото
|
|
|
timestamp = time.strftime("%Y%m%d_%H%M%S")
|
|
|
filename = f"photo_{timestamp}.jpg"
|
|
|
filepath = os.path.join(output_dir, filename)
|
|
|
cv2.imwrite(filepath, frame)
|
|
|
print(f"Сохранено: {filepath}")
|
|
|
capture_count += 1
|
|
|
countdown = 0
|
|
|
else:
|
|
|
# Подсказка
|
|
|
cv2.putText(display, "Press 's' to capture, 'q' to quit", (10, 30),
|
|
|
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,0), 2)
|
|
|
|
|
|
cv2.imshow('Capture', display)
|
|
|
|
|
|
key = cv2.waitKey(1) & 0xFF
|
|
|
if key == ord('q'):
|
|
|
break
|
|
|
elif key == ord('s') and countdown == 0:
|
|
|
countdown = 1
|
|
|
countdown_start = time.time()
|
|
|
|
|
|
camera.release()
|
|
|
cv2.destroyAllWindows()
|
|
|
print(f"Завершено. Сохранено {capture_count} фото.")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
import argparse
|
|
|
parser = argparse.ArgumentParser()
|
|
|
parser.add_argument('--dir', default='captured', help='Папка для сохранения')
|
|
|
parser.add_argument('--camera', type=int, default=0, help='ID камеры')
|
|
|
parser.add_argument('--no-mirror', action='store_true', help='Отключить зеркалирование')
|
|
|
parser.add_argument('--camera_type', default='web', choices=['web', 'oak'])
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
camera = create_camera(camera_type=args.camera_type, camera_id=args.camera, mirror=not args.no_mirror)
|
|
|
capture_photo(output_dir=args.dir, camera)
|