почему метод cv2.VideoCapture read () не возвращает frame, если ret равен True? - PullRequest
0 голосов
/ 22 марта 2020

Сначала я пытаюсь получить кадр, чтобы из него можно было распознать лицо (используя веб-камеру моего компьютера), но при вызове метода read() происходит сбой. говоря tuple index out of range. Я подумал, что это потому, что первый кадр, который я даю для обнаружения, пуст. так что ему нечего превращать в кортеж. но парень, у которого я учусь (конечно, мой учитель дал мне), он делает это, и это работает для него.

мой код:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

ret, frame = cap.read() --> ret is True, but frame is just [[[000,000]]] (and so on with the '0')
print(ret)
face_cascade = cv2.CascadeClassifier('DATA/haarcascades/haarcascade_frontalface_default.xml')
face_rects = face_cascade.detectMultiScale(frame,scaleFactor=1.2,minNeighbors=5)
print(face_rects)

(face_x,face_y,w,h) = tuple(face_rects[0]) --> crashes here saying "tuple index out of range"
track_window = (face_x,face_y,w,h)
roi = frame[face_y:face_y+h,face_x:face_x+w]

hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)

roi_hist = cv2.calcHist([hsv_roi], [0], None, [180], [0, 180])

cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)

term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

while True:

ret, frame = cap.read()

if ret == True:
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)

    ret, track_window = cv2.meanShift(dst, track_window, term_crit)

    x, y, w, h = track_window
    img2 = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 5)

    cv2.imshow("img", img2)

    if cv2.waitKey(1) & 0xFF == 27:
        break
else:
    break

cap.release () cv2.destroyAll Windows ()

1 Ответ

1 голос
/ 22 марта 2020

В основном это [[0000]] .... возвращает черные рамки в начале. Это будет в основном из-за вашей веб-камеры USB, так как для начальной загрузки требуется больше времени. Поскольку ваш профессор может использовать другое оборудование в другой среде, у него может не быть этой проблемы, поскольку он быстро загружается и отправляет кадры. То, что вы можете сделать, это либо поспать пару секунд, основываясь на методе проб и ошибок, либо вы можете просто игнорировать первые пару кадров, основываясь на некоторых методах с ненулевым счетом , таких как np.count_nonzero()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...