使用opencv在python脚本中双重显示

问题描述

我有以下代码:

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()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...