Как применить многоугольную маску к видеопотоку в Python с помощью OpenCV?

Я создаю систему обнаружения парковочных мест с помощью камеры видеонаблюдения на Python, где пользователь сможет вручную определять границы каждого парковочного места, чтобы быть максимально адаптируемым. Сценарий, который позволяет пользователю создавать границы каждого парковочного места, отлично работает и выводит коллекцию фигур в виде массива словарей, каждый словарь содержит координаты x и y каждой точки фигуры как аспекты словаря.

Мне удалось создать многоугольные маски типа , используя следующий код:

img2 = cap # background image
plain = Image.new('L', (cap.shape[1], cap.shape[0]),0) # plain black image
polygon = [(shapes[i]['x1'], shapes[i]['y1']), (shapes[i]['x2'], shapes[i]['y2']), (shapes[i]['x3'], shapes[i]['y3']), (shapes[i]['x4'], shapes[i]['y4'])]
ImageDraw.Draw(plain).polygon(polygon, outline=1, fill=1)
mask = np.array(plain)
masked_img = cv.bitwise_and(img2, img2, mask = mask)
cv.imshow('d',masked_img)

Цель здесь — создать отдельную маску для каждой формы, которую вводит пользователь, использовать обработку изображений и Canny, чтобы определить, находится ли машина в маске, а затем перейти к следующему месту. Повторите этот процесс для каждого ролика и до тех пор, пока есть прямая видеотрансляция. Я предполагаю, что инструкции PIL каким-то образом мешают видеопотоку?

Это мой код, который я написал на данный момент:

while True:
    while i<len(shapes):
        ret, frame = cap.read()
        blank = np.zeros((round(cap.get(3)), round(cap.get(4))))
        polygon = [(shapes[i]['x1'], shapes[i]['y1']), (shapes[i]['x2'], shapes[i]['y2']), (shapes[i]['x3'], shapes[i]['y3']), (shapes[i]['x4'], shapes[i]['y4'])]
        ImageDraw.Draw(blank).polygon(polygon, outline=1, fill=1)
        mask = np.array(blank)
        masked_img = cv.bitwise_and(frame, frame, mask = mask)

Куда мне идти дальше? Спасибо!

Код, который я написал до сих пор, вызывает следующую ошибку:

Traceback (most recent call last):
  File "Python\Python311\Lib\site-packages\PIL\ImageDraw.py", line 843, in Draw
    return im.getdraw(mode)
           ^^^^^^^^^^
AttributeError: 'numpy.ndarray' object has no attribute 'getdraw'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "my workspace\mycode.py", line 38, in <module>
    ImageDraw.Draw(blank).polygon(polygon, outline=1, fill=1)
    ^^^^^^^^^^^^^^^^^^^^^
  File "Python\Python311\Lib\site-packages\PIL\ImageDraw.py", line 845, in Draw
    return ImageDraw(im, mode)
           ^^^^^^^^^^^^^^^^^^^
  File "Python\Python311\Lib\site-packages\PIL\ImageDraw.py", line 62, in __init__
    im.load()
    ^^^^^^^
AttributeError: 'numpy.ndarray' object has no attribute 'load'

Нет, проблема в том, что ImageDraw.Draw требуется изображение, а не массив. Итак, просто создайте пустое изображение, используя Image.new.

Tim Roberts 14.03.2024 07:05

Вы уже используете OpenCV, и он прекрасно способен рисовать полигоны непосредственно в массивах numpy. Почему вы также смешиваете PIL, добавляя ненужную зависимость и усложняя ситуацию?

Dan Mašek 14.03.2024 10:00

нужна ясность. вы показываете тривиальный AttributeError (небрежное сочетание numpy и PIL), но также много говорите о желании определить занятость мест на парковке. что он?

Christoph Rackwitz 14.03.2024 10:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я рекомендовал использовать numpy срезы для обрезки изображений из-за вычислительной нагрузки cv.bitwise_and. Ниже приведен простой пример кода.

import cv2
import numpy as np

img = cv2.imread('top-view-parking-lot.jpg')

while True:
    roi = cv2.selectROI(img)
    print("ROI coordinates: ", roi)
    x, y, w, h = roi
    roi = img[y:y+h, x:x+w]

    edges = cv2.Canny(roi, 50, 150)

    edge_pixels = np.sum(edges > 0)
    print("Number of edge pixels: ", edge_pixels)

    if edge_pixels > 100: # Adjust this threshold as image quality varies
        print("Car detected!")
    else:
        print("No car detected.")

    cv2.imshow('ROI', roi)
    cv2.imshow('Edges', edges)
    if cv2.waitKey(0) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()

Ниже приведены примеры, иллюстрирующие вывод кода для пустых и занятых парковочных мест.

Пример пустого места:

Пример занятого места:

Если у вас есть дополнительные вопросы, пожалуйста, оставьте комментарий.

Использование cv2.selectROI(img) в коде было просто целью демонстрации функциональности. Те же операции можно выполнять с заранее заданными ROI, что соответствует вашему требованию вручную устанавливать границы каждого парковочного места для обеспечения адаптивности. Если бы вы могли предоставить изображение вместе с данными о парковочных местах (данные OP), я мог бы предложить более индивидуальный ответ, который лучше соответствует вашим потребностям.

HOBE 15.03.2024 02:53

Другие вопросы по теме