python - 为什么 python opencv 只从我的网络摄像头读取第一帧?
问题描述
我试图从我的网络摄像头检测人脸,但它只检测到出现在第一帧中的第一张人脸,然后它会崩溃,我已经使用 mtcnn 进行检测操作,在检测到第一张人脸(如果存在)之后然后它将停止捕获并被压碎并保留在屏幕上,我使用 jupyter notebook 作为编辑器,笔记本将继续加载..但不使用mtcnn
检测器也可以正常工作!但是当第一帧中没有人脸时,每当我if boxes:
之前使用它都会引发这个错误for box in boxes:
IndexError:列表索引超出范围
但如果有一张脸,它会引发这个错误:
ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
if boxes:
但如果没有人脸可以检测到,我不会使用它会引发此错误:
TypeError:“NoneType”对象不可迭代
如果在第一帧中检测到人脸,则在检测到人脸后将继续加载!
capture = cv2.VideoCapture(0)
while(True):
ret, frame = capture.read()
frames_tracked = []
print('\rTracking frame: {}'.format(i + 1), end='')
frame_pil = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
frame_pil = Image.fromarray(frame_pil)
boxes,_ = mtcnn.detect(frame_pil)
frame_draw = frame_pil.copy()
draw = ImageDraw.Draw(frame_draw)
for box in boxes:
draw.rectangle(box.tolist(), outline=(255, 0, 0), width=6)
frames_tracked.append(frame_draw.resize((640, 360), Image.BILINEAR))
d = display.display(frames_tracked[0], display_id=True)
i = 1
try:
while True:
d.update(frames_tracked[i % len(frames_tracked)])
i += 1
except KeyboardInterrupt:
pass
if cv2.waitKey('q') == 27:
break
capture.release()
cv2.destroyAllWindows()
请我必须为我的最后一年项目完成我的项目
解决方案
我无法在我的 PC 中重现它,但可能会出现异常:
import cv2
i = 0
capture = cv2.VideoCapture(0)
while(True):
ret, frame = capture.read()
frames_tracked = []
print('\rTracking frame: {}'.format(i + 1), end='')
frame_pil = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
frame_pil = Image.fromarray(frame_pil)
boxes = []
boxes,_ = mtcnn.detect(frame_pil)
frame_draw = frame_pil.copy()
draw = ImageDraw.Draw(frame_draw)
try:
for box in boxes:
draw.rectangle(box.tolist(), outline=(255, 0, 0), width=6)
frames_tracked.append(frame_draw.resize((640, 360), Image.BILINEAR))
except ValueError:
print("Oops! ...")
d = display.display(frames_tracked[0], display_id=True)
i = 1
try:
while True:
d.update(frames_tracked[i % len(frames_tracked)])
i += 1
except KeyboardInterrupt:
pass
if cv2.waitKey('q') == 27:
break
capture.release()
cv2.destroyAllWindows()
如果这不起作用。也许只需检查框是否为无?:
if boxes is not None:
for box in boxes:
print("seems to work")
推荐阅读
- postman - 从 Postman 导出的测试在 Newman 中失败
- google-sheets - 在单元格中写入找到值的行中第一个单元格的每个值
- python - 如何在 Python 3 中调用可选的内部函数
- angular - Angular5 ngAfterviewchecked , scrollIntoView()
- vue.js - 如何使 Vuejs 中的路由与库 i18n 一起使用?
- excel - 如何防止excel在大文件上运行宏时崩溃?
- c# - XmlPoke 任务修剪值
- react-native - API 调用后在 FlatList 中呈现文本
- android - 我应该如何将数据库中的数据更新给我的用户?
- python - 使用蓝图时的 Flask Sqlalchemy 循环导入