我正在使用openCV 2.4.10并尝试实现类似于此处的内容:
https://github.com/andrewssobral/vehicle_detection_haarcascades
我生成了类似于上面项目的cars.xml的文件,但是当我尝试加载其中一个时,我收到以下错误:
OpenCV Error: Unspecified error (The node does not represent a user object (unknown type?)) in cvRead, file C:\builds\2_4_PackSlave-win64-vc12-shared\opencv\modules\core\src\persistence.cpp, line 4991
这是我的加载代码:
CvHaarClassifierCascade *cascade;
cascade = (CvHaarClassifierCascade*)cvLoad("cascade-1.xml", 0, 0, 0);
正如我所说,它加载我的一个xml文件没有问题,但它在另一个文件上给出了该错误。我非常感谢你的帮助。
答案 0 :(得分:1)
OpenCV 2.4文档建议使用CascadeClassifier
类。它成功加载了您的cascade1.xml
文件。以下是在C ++中使用CascadeClassifier
的方法:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include <iostream>
using namespace cv;
int main()
{
CascadeClassifier cascade;
if( !cascade.load( "d:\\OpenCV\\cascade1.xml" ) )
{
std::cout << "Error during loading";
return -1;
}
Mat pic = imread("d:\\Samples\\Cars\\test.jpg");
Mat picGray;
cvtColor( pic, picGray, CV_BGR2GRAY );
std::vector<Rect> objs;
cascade.detectMultiScale( picGray, objs, 1.1, 2, 0, Size(0, 0) );
return 0;
}
答案 1 :(得分:-1)
您必须使用 CvHaarClassifierCascade 类型的不同变量来加载不同的xml文件,并对它们执行不同的检测。
就你的xml文件而言,两者都工作正常,你可以通过下面的python代码检查它。
import cv2
a=cv2.CascadeClassifier('cascade1.xml')
b=cv2.CascadeClassifier('cars.xml')
img=cv2.imread('car.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cars_carcode=a.detectMultiScale(gray,1.3,5)
cars_car=b.detectMultiScale(gray,1.3,5)
def car(cars):
cars=a.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in cars:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray=gray[y:y+h,x:x+w]
roi_color=img[y:y+h,x:x+w]
return (gray,img)
cv2.imshow('Cars Detected by carcode1.xml',car(cars_carcode)[1] )
cv2.imshow('Cars Detected by cars.xml',car(cars_car)[1] )
cv2.waitKey(0)
cv2.destroyAllWindows()