我正在尝试先获取相框,以便可以从中识别出一张脸(使用计算机网络摄像头)
但是当我调用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.destroyAllWindows()
答案 0 :(得分:1)
基本上是[[0000]] ....从头开始返回黑框。这主要是由于您的USB网络摄像头,因为初始加载需要更多时间。由于您的教授可能在不同的环境中使用其他硬件,因此他可能不会遇到此问题,因为它可以快速加载并发送帧。您可以做的是根据试验和错误睡眠几秒钟,或者您可以基于某些{em> count非零方法(例如np.count_nonzero()