在 <module> 灰色 = cv2.cvtColor(帧,cv2.COLOR_BGR2GRAY)?

in <module> gray = cv2.cvtColor(frames, cv2.COLOR_BGR2GRAY)?

我正在尝试用 cv2 制造一辆汽车 detector/classifier 我有一个从 github 下载的 .xml 文件: https://gist.github.com/199995/37e1e0af2bf8965e8058a9dfa3285bc6 每当我 运行 我的代码得到

Traceback (most recent call last):

  File "C:\Users\user1\Downloads\Stuff\Python\cascades\Car_classification.py", line 13, in <module>
    gray = cv2.cvtColor(frames, cv2.COLOR_BGR2GRAY)

error: OpenCV(4.3.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

我的代码是:

import cv2
import numpy as np

cap = cv2.VideoCapture('car.jpg')

font = cv2.FONT_HERSHEY_TRIPLEX

harcascade = cv2.CascadeClassifier("cars.xml")

while True:
    ret,frames = cap.read()

    gray = cv2.cvtColor(frames, cv2.COLOR_BGR2GRAY)
    
    cars = harcascade.detectMultiScale(gray, 1.1 , 2)
    
    for (x,y,w,h) in cars:
        cv2.rectangle(frames,(x,y),(x+w,y+h),(255,0,0),2)
        cv2.putText(frames,str("Car"),(x,y+h),font,1,255)
     
    
    cv2.imshow('img',frames)   

     
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
    
    
cap.release()
cv2.destroyAllWindows()

我的输入图像:

我的输出图像:

它是一辆车,但我不认为轮胎是一辆车!那我做错了什么?

不能说为什么你的分类在汽车上没有任何确定性,因为我不知道 https://gist.github.com/199995/37e1e0af2bf8965e8058a9dfa3285bc6 came from. Without knowing that, I can't say what kind of images it's expected to be able to detect. It's possible that it was trained to recognize cars from images more like this 在哪里,甚至缩小得更多。在这种情况下,您的示例图像与经过训练的检测图像完全不同。不了解更多是不可能的。

至于你收到的那条错误信息,我至少可以 解释一下。

cap = cv2.VideoCapture('car.jpg')

您正在以视频形式打开图像。在第一次通过循环时,它(令人惊讶地)能够读取图像数据,但是在下一次通过之后就没有更多的“帧”可以读取了,所以你的 frames 对象是 None,有其中没有图像数据。这意味着当您尝试将其转换为灰度时,操作失败。