68 lines
2.7 KiB
Python
68 lines
2.7 KiB
Python
import cv2
|
||
import os
|
||
|
||
# Создаем папку для сохранения вырезанных объектов
|
||
output_folder = 'output_rectangles'
|
||
if not os.path.exists(output_folder):
|
||
os.makedirs(output_folder)
|
||
|
||
# Инициализируем видеокамеру
|
||
cap = cv2.VideoCapture(0)
|
||
|
||
# Ширина и высота прямоугольника
|
||
rect_width, rect_height = 340, 200
|
||
|
||
while True:
|
||
# Считываем кадр с камеры
|
||
ret, frame = cap.read()
|
||
|
||
# Определение координат центра экрана
|
||
center_x, center_y = frame.shape[1] // 2, frame.shape[0] // 2
|
||
|
||
# Вычисляем координаты верхнего левого и нижнего правого углов прямоугольника
|
||
x1, y1 = center_x - rect_width // 2, center_y - rect_height // 2
|
||
x2, y2 = center_x + rect_width // 2, center_y + rect_height // 2
|
||
|
||
# Рисуем прямоугольник для поднесения объекта
|
||
cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
|
||
|
||
# Отображаем кадр
|
||
cv2.imshow('Frame', frame)
|
||
|
||
# Считываем кадр с камеры в оттенках серого
|
||
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||
|
||
# Выполняем размытие для уменьшения шумов
|
||
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
|
||
|
||
# Выполняем детекцию краев с использованием оператора Canny
|
||
edges = cv2.Canny(blurred, 50, 150)
|
||
|
||
# Находим контуры в изображении
|
||
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
||
|
||
# Ищем прямоугольники, соответствующие заданным размерам
|
||
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)
|
||
|
||
# Вырезаем объект из кадра
|
||
roi = frame[y:y + h, x:x + w]
|
||
|
||
# Генерируем имя файла для сохранения
|
||
filename = os.path.join(output_folder, 'rectangle_object.jpg')
|
||
|
||
# Сохраняем изображение объекта
|
||
cv2.imwrite(filename, roi)
|
||
|
||
# Выход из цикла при нажатии клавиши 'q'
|
||
if cv2.waitKey(1) == ord('q'):
|
||
break
|
||
|
||
# Освобождаем ресурсы
|
||
cap.release()
|
||
cv2.destroyAllWindows()
|