opencv 级联分类器引发错误:(-5:参数错误)输入文件在函数“cv::FileStorage::Impl::open”中无效

rqenqsqc  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(747)

我尝试使用简单的级联分类器来检测图像上给出的停车标志,图像如下所示:

我已经实现了代码,也发现了以下xml文件:
stopsign_classifier_haar.xml
但返回以下错误:
cv2.error: OpenCV(4.5.5) D:\a\opencv-python\opencv-python\opencv\modules\core\src\persistence.cpp:682: error: (-5:Bad argument) Input file is invalid in function 'cv::FileStorage::Impl::open'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\User\PycharmProjects\AI_Project\stop_sign_detection.py", line 6, in <module>
    stop_data = cv2.CascadeClassifier('stopsign_classifier_haar.xml')
SystemError: <class 'cv2.CascadeClassifier'> returned a result with an exception set

我已经尝试了很多研究,包括stackoverflow、githubs、此链接以及haarcascade file issue。我还在www.example.com的默认目录中找到了xml文件cv2.data,但根本没有解决方案。我尝试了从不同目录下载的不同级联文件,但0结果
下面是我代码解决方案

import cv2

import matplotlib.pyplot as plt
image =cv2.imread("stop.jpg")
img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
img_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
stop_data = cv2.CascadeClassifier('stopsign_classifier_haar.xml')
found =stop_data.detectMultiScale(img_gray,minSize=(20,20),scaleFactor=1.2)
amount_found = len(found)
if amount_found !=0:
    for (x,y,width,height) in found :
        cv2.rectangle(img_rgb,(x,y),(x+height,y+width),(0,255,0),5)
plt.subplot(1, 1, 1)
plt.imshow(img_rgb)
plt.show()
#plt.subplot(1, 1, 1)
#plt.imshow(img_rgb)
#plt.show()

此代码片段取自给定链接:geeks for geeks for haar
当我试图从这个网站上显示的链接下载-链接被打破,因此我试图从不同的来源下载,但得到这样的错误,请告诉我什么是错误的代码?

s3fp2yjn

s3fp2yjn1#

因为这是以前的情况下,经过大量的研究,我发现以下kaggle网站,其中适当的xml文件位于working cascade for stop sign
下面是我的代码:

import cv2
from cv2.cv2 import CascadeClassifier
import matplotlib.pyplot as plt
image =cv2.imread("stop.jpg")
img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
img_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
stop_data = CascadeClassifier('cascade_stop_sign.xml')
found =stop_data.detectMultiScale(img_gray,minSize=(20,20),scaleFactor=1.2)
amount_found = len(found)
if amount_found !=0:
    for (x,y,width,height) in found :
        cv2.rectangle(img_rgb,(x,y),(x+height,y+width),(0,255,0),5)
plt.subplot(1, 1, 1)
plt.imshow(img_rgb)
plt.show()
#plt.subplot(1, 1, 1)
#plt.imshow(img_rgb)
#plt.show()

结果:

因此,如果有人可能需要帮助,在未来,你可以使用我的答案作为参考。谢谢提前

相关问题