cv::CascadeClassifier类在多次读取新版本xml模型时的错误及其修正
(2012-04-25 14:57:08)
CascadeClassifier *pClassifier = new CascadeClassifier;
若在程序的使用中,不释放该对象,只是来回在Haar特征和LBP特征之间切换,比较两种特征检测人脸的效果,如下:
Mat matImage;
vector<Rect> objs;
pClassifier->load("haarcascade_frontalface_default.xml");
pClassifier->detectMultiScale(matImage, objs, 1.1, 3);
pClassifier->load("lbpcascade_frontalface.xml");
pClassifier->detectMultiScale(matImage, objs, 1.1, 3);
pClassifier->load("haarcascade_frontalface_default.xml");
pClassifier->detectMultiScale(matImage, objs, 1.1, 3);
pClassifier->load("lbpcascade_frontalface.xml");
pClassifier->detectMultiScale(matImage, objs, 1.1, 3);
那么程序会果断的崩溃,因为lbpcascade_frontalface.xml文件格式是新版本的。
vector<Stage> CascadeClassifier::stages
该变量的size决定了循环的次数。如果当前模型只有20个stage,但是上次读取xml时该变量没有清空,那么CascadeClassifier::stages的长度可能会变成40。于是当前检测人脸的时候会循环40次,但是模型实际上只有20个stage,循环次数超过20的时候,索引出来的其他变量可能就是无效的,从而导致下标越界,使程序崩溃。
转载:http://blog.sina.com.cn/s/blog_4298002e010153hn.html#cmt_3085837