概述
想找到OpenCV中1.0的版本的Haar特征检测与2.0版本的Haar特征检测的差异,用同样的数据集训练了一个人脸检测模型,然后使用opencv_traincascade.exe级联出来,加上-baseFormatSave命令可以级联出老版本的xml,暂且命名为casacde_1.0.xml,而默认的是不加-baseFormatSave命令级联出来的是新版本的xml,暂且命名为cascade_2.0.xml。然后使用如下代码去加载模型。
CascadeClassifier detector;
std::string cascade_filename = "cascade_1.0.xml";
detector.load(cascade_filename);
if (detector.empty())
{
cout << "load classifier failed!" << endl;
return -1;
}
在第三行load函数这里崩溃了,如下图所示
单步跟踪进入load函数,一路跟踪到崩溃的地方if( !CV_NODE_IS_USER(node->tag) || !node->info ),在OpenCV源码persistence.cpp中的,如下代码段
/* reads matrix, image, sequence, graph etc. */
CV_IMPL void*
cvRead( CvFileStorage* fs, CvFileNode* node, CvAttrList* list )
{
void* obj = 0;
CV_CHECK_FILE_STORAGE( fs );
if( !node )
return 0;
if( !CV_NODE_IS_USER(node->tag) || !node->info )
CV_Error( CV_StsError, "The node does not represent a user object (unknown type?)" );
obj = node->info->read( fs, node );
if( list )
*list = cvAttrList(0,0);
return obj;
}
node->info是0x00000000000,触发了CV_Error( CV_StsError, "The node does not represent a user object (unknown type?)" );
于是,我打开OpenCV安装目录,C:opencvsourcesdatahaarcascades,找到haarcascade_frontalface_alt2.xml,用Notepad++打开,头部片段如下:
<opencv_storage>
<haarcascade_frontalface_alt2 type_id="opencv-haar-classifier">
<size>20 20</size>
<stages>
<_>
<!-- stage 0 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>2 7 16 4 -1.</_>
<_>2 9 16 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>4.3272329494357109e-003</threshold>
<left_val>0.0383819006383419</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
而我用-baseFormatSave命令可以级联出老版本的xml头部片段如下:
<?xml version="1.0"?>
<opencv_storage>
<cascade>
<size>
24 24</size>
<stages>
<_>
<trees>
<_>
<_>
<feature>
<rects>
<_>
2 0 21 9 -1.</_>
<_>
9 3 7 3 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.4910642206668854e-001</threshold>
<left_val>-9.2149019241333008e-001</left_val>
<right_val>7.8150141239166260e-001</right_val></_></_>
<_>
<_>
看到<opencv_storage>下面的那一行,OpenCV自带的模型是<haarcascade_frontalface_alt2 type_id="opencv-haar-classifier">,而我用-baseFormatSave命令可以级联出老版本的xml对应的这一行是<cascade>。这里少了type_id="opencv-haar-classifier"。修改成<cascade type_id="opencv-haar-classifier">,就可以顺利地加载老版本的xml模型进行haar特征检测了。
最后
以上就是紧张草丛为你收集整理的解决OpenCV 2.4.9加载老版本的xml模型进行Haar特征人脸检测崩溃的bug的全部内容,希望文章能够帮你解决解决OpenCV 2.4.9加载老版本的xml模型进行Haar特征人脸检测崩溃的bug所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复