Я занимаюсь созданием программы обратной связи в реальном времени с использованием Python и OpenCV: веб-камера будет наблюдать за процессом и генерировать обратную связь на основе того, что происходит.
Вот мой код:
points = get_points_xml()
rect = cv2.boundingRect(np.array(points))
x, y, w, h = rect
cap = cv2.VideoCapture(0)
while (True):
ret, frame = cap.read()
cropped = frame[y: y + h, x: x + w]
ycb = cv2.cvtColor(cropped.copy(), cv2.COLOR_BGR2YCrCb)
y, cr, br = cv2.split(ycb)
blur = cv2.blur(y, (5, 5))
size = blur.size
ret, thresh = cv2.threshold(blur, 60, 255, cv2.THRESH_BINARY)
saturated, area_sat = get_saturated(thresh)
print(saturated, "pixels", area_sat, "cm2")
ret, thresh = cv2.threshold(blur, 80, 140, cv2.THRESH_BINARY_INV)
empty, area_empty = get_saturated(thresh)
print(empty, "pixels", area_empty, "cm2")
unsaturated = size - saturated - empty
area_unsat = unsaturated/cm2
print(unsaturated, "pixels", area_unsat, "cm2")
if (cv2.waitKey(1) & 0xFF == ord('q')):
break
cap.release()
cv2.destroyAllWindows()
Выполнение линии
cropped = frame[y: y + h, x: x + w]
приводит к следующей ошибке:
TypeError: only integer scalar arrays can be converted to a scalar index
Это странно, потому что в «первом раунде» цикла while моя программа работает нормально, а затем во «втором раунде» цикла while появляется указанная выше ошибка.
Что может быть причиной этого?





Вы должны предоставить любую соответствующую информацию, когда задаете вопрос.
Возможный ответ на ваш вопрос:
Измените эту строку в своем коде:
cropped = frame[y: y + h, x: x + w]
К
cropped = frame[int(round(y)):int(round(y + h)), int(round(x)):int(round(x + w))]
Таким образом, вы можете убедиться, что все значения, которые вы использовали для обрезки кадра, являются целыми числами.
Чем отличается первая и вторая итерации:
frame? Нет.h? Нет.x? Нет.w? Нет.y? Да, его переназначают. В первой итерации это предположительно вертикальное положение прямоугольника, а во второй итерации это Y-компонент цвета. Эти две вещи следует называть по-разному.