如何改进我的 OpenCV 识别代码以找到上半身并在将 CCTV 流作为输入时减少资源?

How do I improve my OpenCV recognition code to find upper body and also cut down on resources while having a CCTV stream as input?

如何让我的opencv识别更准确,我只是使用haarcascade在我的cctv的灰色框架中找到上半身,但它占用了大量资源并且没有给出足够好的结果.我应该使用大纲或其他方法来减少资源吗?我也有一个 GPU,但我不知道如何 link 以便我的计算使用我的 GPU。

import cv2


body_casc = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_upperbody.xml')
vcap= cv2.VideoCapture("rtsp://192.168.29.99")

while True:
    try:
        
        ret,frame=vcap.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        body = body_casc.detectMultiScale(gray,1.1,4)

        for (x,y,w,h) in body:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),5)

        cv2.imshow("VIDEO",frame)
    except Exception as e:
        print("ERROR : "+str(e))

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

    

cv2.destroyAllWindows()

我的摄像头通过 IPC 连接到我的闭路电视,一段时间后它就停止发出帧,returns 这个错误。

error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

让我们从头开始。

error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

错误出现是因为没有可用的帧可以转换。这可能是由于相机断开连接或不合适的帧引起的。我建议你在处理之前检查任何帧:

    ret,frame=vcap.read()

    # if frame is read correctly ret is True
    if not ret:
           print("Can't receive frame (stream end?). Exiting ...")
           break

另一方面,你问的是如何让检测更准确。首先,haarcascade 不是一个完美的工具,您可以使用它来代替它,它确实更快。根据你的硬件规格,你可以选择其他类型的AI算法,如YOLO,R-CNN等。或者如果你坚持使用haarcascades,你应该根据你的情况定义参数。您可以查看detectMultiscale包含的参数。