IndexError: допустимы только целые числа, срезы (`:`), многоточие (`...`), numpy.newaxis (`None`) и целые или логические массивы. Дополненная реальность - PullRequest
0 голосов
/ 26 июня 2018
while True:

# Stage 1: Read an image from our webcam
image = webcam.get_current_frame()

# Stage 2: Detect edges in image
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5,5), 0)
edges = cv2.Canny(gray, 100, 200)

# Stage 3: Find contours
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]

for contour in contours:

    # Stage 4: Shape check
    perimeter = cv2.arcLength(contour, True)
    approx = cv2.approxPolyDP(contour, 0.01*perimeter, True)

    if len(approx) == QUADRILATERAL_POINTS:

        # Stage 5: Perspective warping
        topdown_quad = get_topdown_quad(gray, approx.reshape(4, 2))

        # Stage 6: Border check
        if topdown_quad[(topdown_quad.shape[0]/100.0)*5, 
                        (topdown_quad.shape[1]/100.0)*5] > BLACK_THRESHOLD: continue

В строке

if topdown_quad [(topdown_quad.shape [0] /100.0) * 5, (topdown_quad.shape [1] /100.0) * 5]> BLACK_THRESHOLD: 
    continue

происходит ошибка

Почему это происходит?

1 Ответ

0 голосов
/ 26 июня 2018

(topdown_quad.shape [0] /100.0) * 5 и (topdown_quad.shape [1] /100.0) * 5 являются значениями с плавающей точкой.

Вы не можете использовать значения с плавающей точкой в ​​качестве индексов в Python.

Вот что говорит вам сообщение об ошибке (как бы многословно): NumPy расширяет индексирование Python для обработки целого ряда различных типов индексов, но все они по-прежнему либо целые числа, либо кусочки целых чисел,или специальные значения.

И не ясно, что вы на самом деле хотите здесь.Если, скажем, topdown_quad.shape[0] равно 75, то topdown_quad.shape[0] / 100 * 5 равно 3,75, хотите ли вы строку 3 или строку 4?Возможно, вы захотите усечь до 0 (или до отрицательной бесконечности, если значения могут быть отрицательными), или округлить до ближайшего, или округлить в стиле IEEE с округлением .5 вверх или вниз в зависимости от того, является ли интегральная часть четной, или что-либо ещеостальное.

Что бы вы ни хотели, вы должны написать это явно.Например, если вы хотите усечь:

    if topdown_quad[int((topdown_quad.shape[0]/100.0)*5),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...