OpenCV中gpu下使用cascade classifier遇到问题的解决方案

来源:互联网 发布:淘宝宝贝图片尺寸教程 编辑:程序博客网 时间:2024/04/30 04:35

        在使用opencv gpu模块下的CascadeClassifier_GPU时,遇到了几个当时很难理解,网上也找不到答案的问题。最近空闲下来,翻了opencv的源码,找到了问题所在。写出来希望能让遇到同样问题的人少走弯路~

    

        先交代下环境:VS2013+opencv2.4.11

问题1:用haar training训练出分类器,但是gpu调用出现下面的错误:

        OpenCV Error: Gpu API call (NCV Assertion Failed: retcode=26, file=opencv-2.4.11/modules/gpu/src/nvidia/NCVHaarObjectDetection.cu, line=1589

解决:这是因为在训练的时候,haar 特征选取了45度特征导致的。

过程:程序运行中断之后,一步一步的查为什么中断


可以看到,是由于haar.bNeedsTiltedII == false引起了中断,然后查找在哪里给haar.bNeedsTiltedII赋值了。分析了xml文件在cpu和gpu中的载入代码,找到了NCVStatus loadFromXML(const std::string &filename,HaarClassifierCascadeDescriptor &haar, std::vector<HaarStage64> &haarStages, std::vector<HaarClassifierNode128> &haarClassifierNodes,std::vector<HaarFeature64> &haarFeatures)函数,里面有一句对haar.bNeedsTiltedII的更新:



feature是这样子的: CvHaarFeature* feature = &tree->haar_feature[n];所以就可以找到CvHaarFeature结构里面tilted的定义。然后,这个变量的定义居然没有注释,最后在另外一个博客中找到了定义,参数titled,0表示该特征是标准的haar-like特征,1表示旋转45°后的特征。

博客地址:http://www.cnblogs.com/pakfahome/p/3611303.html

然后我猛然发现,我自己训练的时候,指定的-mode 是ALL......


        问题2:直接把samples/gpu路径下面的cascadeclassifier.cpp文件复制出来,编译运行,使用data下面的haarcascade_frontalface_alt.xml,结果出现下面的错误:

        OpenCV Error: Unspecified error (The node does not represent a user object (unknown type?)) in cvRead, file ******(此处是路径)persistence.cpp, line 5008

解决:如果想用opencv自带的那些xml,去下载2.4.13,里面的data文件夹,有一个叫做gpu的文件夹,专门有给gpu 用的xml文件,2.4.11里面没有。

过程:当时实在是不知道为什么,同样的数据集,用cpu载入没有问题,怎么到了gpu下面就出错了呢?看了opencv的帮助


上面说gpu只支持haar training训练出来的分类器,由于当时我需要使用自己训练的xml,所以这个错误也没在意,后续解决也是巧合,偶然看2.4.13的data文件夹,发现里面有一个叫做gpu的文件夹,专门有给gpu 用的数据。

2 0
原创粉丝点击