问题描述
我有以下代码:
import numpy as np
import cv2
import pickle
import rtsp
import PIL as Image
face_cascade = cv2.CascadeClassifier('cascades\data\haarcascade_frontalface_alt2.xml')
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read("trainner.yml")
labels = {"person_name": 1}
with open("labels.pickle",'rb') as f:
og_labels = pickle.load(f)
labels = {v:k for k,v in og_labels.items()}
url = 'rtsp://user:pass@xxx.xxx.x.xxx:YYYY/stream0/mobotix.mjpeg'
with rtsp.Client(url) as client:
client.preview()
while True:
frame = client.read(raw=True)
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,scaleFactor=1.3,minNeighbors=5)
for (x,y,w,h) in faces:
print(x,h)
roi_gray = gray[y:y+h,x:x+w]
roi_color = frame[y:y+h,x:x+w]
#recognize?
id_,conf = recognizer.predict(roi_gray)
if conf>=45: # and conf <=85:
print(id_)
print(labels[id_])
font = cv2.FONT_HERSHEY_SIMPLEX
name = labels[id_]
color = (0,255)
stroke = 2
cv2.putText(frame,name,(x,y),font,1,color,stroke,cv2.LINE_AA)
#img_item = "my-image.png"
#cv2.imwrite(img_item,roi_gray)
color = (0,255)
stroke = 2
end_cord_x = x + w
end_cord_y = y + h
cv2.rectangle(frame,(end_cord_x,end_cord_y),stroke)
cv2.imshow('IP cam',frame)
if cv2.waitKey(20) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
一切正常,我正在运行我的代码,首先是打开“ client.preview”的Cam视图,人脸检测此时不起作用。当我关闭此摄像机时,将打开IPcam窗口,并且一切正常。 (RTSP流仍会丢失很多帧,但没有直接问题。)
如果我没有保留代码“ client.preview”,则由于src_empty,我从opencv收到错误消息。 如果我尝试将代码更改为“ client.read()”同上,则由于src_empty,opencv会发生错误。
我该如何解决?
解决方法
在rtsp客户端收到其第一帧之前,在rtsp客户端上的读取调用将返回None。当您调用“ client.preview”时,打开窗口所花费的时间使rtsp客户端有足够的时间在调用第一次读取之前从流中接收第一帧。超出此范围的所有read调用都将始终返回一个框架,这就是为什么当代码中包含所有内容时一切正常的原因。解决此问题的方法是检查rtsp客户端的读取功能结果,以确保在处理帧之前已收到帧。
import numpy as np
import cv2
import pickle
import rtsp
import PIL as Image
import time
face_cascade = cv2.CascadeClassifier('cascades\data\haarcascade_frontalface_alt2.xml')
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read("trainner.yml")
labels = {"person_name": 1}
with open("labels.pickle",'rb') as f:
og_labels = pickle.load(f)
labels = {v:k for k,v in og_labels.items()}
url = 'rtsp://user:pass@xxx.xxx.x.xxx:YYYY/stream0/mobotix.mjpeg'
with rtsp.Client(url) as client:
client.preview()
while True:
frame = client.read(raw=True)
if frame is not None:
time.sleep(.10)
else:
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,scaleFactor=1.3,minNeighbors=5)
for (x,y,w,h) in faces:
print(x,h)
roi_gray = gray[y:y+h,x:x+w]
roi_color = frame[y:y+h,x:x+w]
#recognize?
id_,conf = recognizer.predict(roi_gray)
if conf>=45: # and conf <=85:
print(id_)
print(labels[id_])
font = cv2.FONT_HERSHEY_SIMPLEX
name = labels[id_]
color = (0,255)
stroke = 2
cv2.putText(frame,name,(x,y),font,1,color,stroke,cv2.LINE_AA)
#img_item = "my-image.png"
#cv2.imwrite(img_item,roi_gray)
color = (0,255)
stroke = 2
end_cord_x = x + w
end_cord_y = y + h
cv2.rectangle(frame,(end_cord_x,end_cord_y),stroke)
cv2.imshow('IP cam',frame)
if cv2.waitKey(20) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
,
好的,我知道RTSP协议首先要发送空帧并建立缓冲区。
with rtsp.Client(url) as client:
while True:
frame = client.read(raw=True)
if not frame:
time.sleep(.30)
else:
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,minNeighbors=5)
for (x,h) in faces:
cv2.imshow('IP cam',frame)
if cv2.waitKey(20) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
由于双重功能,我删除了这一行:client.preview()。 代码正在启动,经过一段时间后,我收到以下错误:
if not frame:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()