Функция cv2.HoughLinesP
ожидает одноканальное изображение, поэтому обрезанная область может быть взята из серого изображения, и это устранит ошибку:
# Crop the image
roi = list(map(int, roi)) # Convert to int for simplicity
cropped = gray[roi[1]:roi[1]+roi[3], roi[0]:roi[0]+roi[2]]
Обратите внимание, что я меняю имя вывода с roi
на cropped
, и это потому, что вам все еще понадобится поле roi
. Точки x1
, x2
, y1
и y2
являются позициями пикселей в кадрированном изображении, а не в полном изображении. Чтобы правильно нарисовать изображения, вы можете просто добавить верхний левый угол позиции пикселя от roi
.
Вот цикл for с соответствующими правками:
# Find lines
minLineLength = 100
maxLineGap = 30
lines = cv2.HoughLinesP(cropped,1,np.pi/180,100,minLineLength,maxLineGap)
for x in range(0, len(lines)):
for x1,y1,x2,y2 in lines[x]:
cv2.line(img,(x1+roi[0],y1+roi[1]),(x2+roi[0],y2+roi[1]),(237,149,100),2)