关于 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将不是图像文件的行删去,只留下图像文件所在行(印象中删去了两行),并把文件保存成此种格式:关于 opencv 训练LBP联级分类器的傻瓜式操作_第1张图片

后面的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文件夹。最终的问价个数见下图:关于 opencv 训练LBP联级分类器的傻瓜式操作_第2张图片

双击后运行训练。完成后可在data下生成xml文件。

5:测试。用opencv的

CascadeClassifier 和 
detectMultiScale测试生成的xml。以下附上测试代码:

 

cv::Mat img, gray;
    std::vector 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);
 

测试结果如图:关于 opencv 训练LBP联级分类器的傻瓜式操作_第3张图片

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

你可能感兴趣的:(opencv)