From 330add6932cb083222064281026f15f611cb28c1 Mon Sep 17 00:00:00 2001 From: Vlad Date: Fri, 2 Feb 2024 17:45:41 +0600 Subject: [PATCH] video --- videoKard.py | 93 +++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 49 deletions(-) diff --git a/videoKard.py b/videoKard.py index 231d541..9d46c94 100644 --- a/videoKard.py +++ b/videoKard.py @@ -1,67 +1,62 @@ import cv2 -import os +import numpy as np -# Создаем папку для сохранения вырезанных объектов -output_folder = 'output_rectangles' -if not os.path.exists(output_folder): - os.makedirs(output_folder) +def detect_rectangle(frame, template, threshold): + result = cv2.matchTemplate(frame, template, cv2.TM_CCOEFF_NORMED) + _, max_val, _, max_loc = cv2.minMaxLoc(result) -# Инициализируем видеокамеру -cap = cv2.VideoCapture(0) + # Check if the maximum correlation coefficient is above the threshold + print(max_val) -# Ширина и высота прямоугольника -rect_width, rect_height = 340, 200 + if max_val >= threshold: + # Define the rectangle area + h, w = template.shape[:2] + top_left = max_loc + bottom_right = (top_left[0] + w, top_left[1] + h) -while True: - # Считываем кадр с камеры - ret, frame = cap.read() + # Draw rectangle on the frame + cv2.rectangle(frame, top_left, bottom_right, (0, 255, 0), 2) - # Определение координат центра экрана - center_x, center_y = frame.shape[1] // 2, frame.shape[0] // 2 + # Crop the region within the rectangle + cropped_region = frame[top_left[1]:bottom_right[1], top_left[0]:bottom_right[0]] - # Вычисляем координаты верхнего левого и нижнего правого углов прямоугольника - x1, y1 = center_x - rect_width // 2, center_y - rect_height // 2 - x2, y2 = center_x + rect_width // 2, center_y + rect_height // 2 + # Save the cropped region as an image + cv2.imwrite('output_vlad.png', cropped_region) + exit(0) - # Рисуем прямоугольник для поднесения объекта - cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2) + return frame - # Отображаем кадр - cv2.imshow('Frame', frame) +def main(): + # Load the template image (ID card template) + template = cv2.imread('img/imgsmall.png', 0) # Make sure to replace with the actual template image - # Считываем кадр с камеры в оттенках серого - gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + # Start capturing video from the default camera (you can change the index if using an external camera) + cap = cv2.VideoCapture(0) - # Выполняем размытие для уменьшения шумов - blurred = cv2.GaussianBlur(gray, (5, 5), 0) + while True: + # Read a frame from the camera + ret, frame = cap.read() - # Выполняем детекцию краев с использованием оператора Canny - edges = cv2.Canny(blurred, 50, 150) + if not ret: + print("Failed to capture frame") + break - # Находим контуры в изображении - contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + # Convert the frame to grayscale + gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) - # Ищем прямоугольники, соответствующие заданным размерам - for contour in contours: - x, y, w, h = cv2.boundingRect(contour) - if rect_width - 50 <= w <= rect_width + 50 and rect_height - 50 <= h <= rect_height + 50 and \ - x >= x1 and y >= y1 and x + w <= x2 and y + h <= y2: - # Рисуем прямоугольник вокруг объекта - cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) + # Detect rectangles in the frame with a threshold + frame_with_rectangle = detect_rectangle(gray_frame, template, threshold=0.5) - # Вырезаем объект из кадра - roi = frame[y:y + h, x:x + w] + # Display the result + cv2.imshow('Object Detection', frame_with_rectangle) - # Генерируем имя файла для сохранения - filename = os.path.join(output_folder, 'rectangle_object.jpg') + # Break the loop if 'q' is pressed + if cv2.waitKey(1) & 0xFF == ord('q'): + break - # Сохраняем изображение объекта - cv2.imwrite(filename, roi) + # Release the camera and close all OpenCV windows + cap.release() + cv2.destroyAllWindows() - # Выход из цикла при нажатии клавиши 'q' - if cv2.waitKey(1) == ord('q'): - break - -# Освобождаем ресурсы -cap.release() -cv2.destroyAllWindows() +if __name__ == "__main__": + main()