Я создаю систему обнаружения парковочных мест с помощью камеры видеонаблюдения на 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'
Вы уже используете OpenCV, и он прекрасно способен рисовать полигоны непосредственно в массивах numpy. Почему вы также смешиваете PIL, добавляя ненужную зависимость и усложняя ситуацию?
нужна ясность. вы показываете тривиальный AttributeError
(небрежное сочетание numpy и PIL), но также много говорите о желании определить занятость мест на парковке. что он?
Я рекомендовал использовать 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), я мог бы предложить более индивидуальный ответ, который лучше соответствует вашим потребностям.
Нет, проблема в том, что
ImageDraw.Draw
требуется изображение, а не массив. Итак, просто создайте пустое изображение, используяImage.new
.