关于 Opencv 训练LBP联级分类器的傻瓜式操作


  最近需要做一个联级分类器来定位图像中的目标(用车牌定位来做例子),于是选用opencv的LBP算法。关于介绍,这篇博文写的还可以 点击打开链接 实现的时候查找其他博客也遇到了很多问题,我用的是opencv3.2版本,为了以后方便查看,做下记录。下面是我使用的过程:

  1:首先准备数据集。数据集与SVM类似,分为车牌图片和非车牌图片。图像为灰度图,分别放在pos和neg文件夹下。我用到的数据是pos:328个,neg:1000个。关于数量调整以后还要做测试。

  2:copy opencv安装目录下的opencv_traincascade.exe和opencv_createsamples.exe

  3:生成路径。首先进入pos文件夹下新建一个get route.bat文件,文件内容为:dir /b > pos.txt。双击运行后会在pos文件夹下出现pos.txt文件,然后将pos.txt文件和get route.bat文件一同copy出来放到与pos文件夹同级目录下。接下来打开pos.txt将不是图像文件的行删去,只留下图像文件所在行(印象中删去了两行),并把文件保存成此种格式:

  后面的130 30即是pos图像文件的宽和高。然后用同样的方法生成neg.txt,copy到与之相同文件夹下。不同的是neg.txt中的内容无需做修改,但要删除非图像文件名所在行(印象中也是两行)。接下来在同级目录下新建createsamples.bat。内容为:

opencv_createsamples.exe -info pos.txt -vec pos_LBP.vec -num 328 -w 130 -h 30

pause 双击后生成pos_LBP文件。(注意参数,要和你的参数相匹配)

  4:训练xml。在同一级目录下新建train.bat。内容为:

opencv_traincascade.exe -data data -vec pos_LBP.vec -bg neg.txt -numPos 328 -numNeg 1000 -featureType LBP -numStages 10 -w 130 -h 30 -minHitRate 0.9999 -maxFalseAlarmRate 0.5 -mode ALL

pause

(同样注意参数)

  在这里参数就不做过多注释了。新建data文件夹。最终的问价个数见下图:

  双击后运行训练。完成后可在data下生成xml文件。
  5:测试。用opencv的CascadeClassifier 和 detectMultiScale测试生成的xml。以下附上测试代码:

cv::Mat img, gray;
    std::vector<Rect> plate;
    CascadeClassifier plate_cascade;
    if (!plate_cascade.load("E:\\data\\cascade.xml")){
        printf("--(!)Error loading plate\n");
        return -1;
    };

    img = cv::imread("C:\\Users\\Administrator\\Pictures\\chepai\\bug\\plate_detect.jpg");
    cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
    //cv::GaussianBlur(gray, gray, Size(5, 5), 0, 0, 4);  //高斯滤波
    plate_cascade.detectMultiScale(gray,plate, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(130, 30));
for (size_t i = 0; i < plate.size(); i++){
    cv::Point center(plate[i].x + plate[i].width*0.5, plate[i].y + plate[i].height*0.5);
    cv::ellipse(img, center, Size(plate[i].width*0.5, plate[i].height*0.5), 0, 0, 360, 
                Scalar(255, 0, 0), 4, 8, 0);
}
//    cv::namedWindow("img", cv::WINDOW_NORMAL);
    cv::imshow("img", img);
    cv::waitKey(0);

测试结果如图:

这个分类器还需做进一步调整,如有问题欢迎随时提问!


文章作者: xiangyi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xiangyi !
评论
 上一篇
Qt5.6之后与网页html/js的交互实现 Qt5.6之后与网页html/js的交互实现
转发记录一下。。。  本篇文章主要讲解Qt5.6之后的QWebEngine与html或js的交互。在Qt5.6之前Qt窗体嵌入网页使用的是QWebKit但是Qt5.6将webkit去掉了,这时候很多人由于以前的项目中使用
2018-09-18
下一篇 
小记录:关于opencv3.X中的gauss滤波和图像类型转换 小记录:关于opencv3.X中的gauss滤波和图像类型转换
我的开发环境:windows下opencv3.2,QT4.8.6。遇到的问题是: smooth = cvCreateImage(cvGetSize(iplImg),IPL_DEPTH_8U,1);
2017-12-25
  目录