OpenCV之级联分类器训练与使用(二) Haar与LBP级联分类器使用

OpenCV中的HAAR与LBP数据
    HAAR特征数据    参看 haarcascade_frontalface_alt.xml 各标签
    LBP特征数据     参看 lbpcascade_frontalface.xml 各标签
    数据格式XML
HAAR与LBP的区别:
    HAAR特征是浮点数计算
    LBP特征是整数计算
    LBP训练需要的样本数量要比HAAR大
    同样的样本空间, HAAR训练出来的数据检测结果要比LBP准确
    扩大LBP的样本数据,训练结果可以跟HAAR一样
    LBP的速度一般可以比HAAR快几倍

代码: haar特征检测与lbp特征检测对比

    #include "../common/common.hpp"

    static CascadeClassifier haar_cascader;
    static CascadeClassifier lbp_cascader;
    static String haarfile = "project/workspace_vs/OpenCV310Sources_contrib/install/etc/haarcascades/haarcascade_frontalface_alt.xml"; // haar特征训练数据
    static String lbpfile = "project/workspace_vs/OpenCV310Sources_contrib/install/etc/lbpcascades/lbpcascade_frontalface.xml"; // lbp特征训练数据

    void main(int argc, char** argv) {
        haar_cascader.load(getCVImagesPath(haarfile));
        lbp_cascader.load(getCVImagesPath(lbpfile));
        Mat src_haar = imread(getCVImagesPath("images/test1_3.png"), IMREAD_COLOR);
        Mat src_lbp, gray;
        src_haar.copyTo(src_lbp);
        imshow("src4-4", src_haar);

        vector<Rect> faces;
        cvtColor(src_haar, gray, COLOR_BGR2GRAY);
        equalizeHist(gray, gray);

        double st = getTickCount();
        haar_cascader.detectMultiScale(gray, faces, 1.1, 3, 0, Size(30, 30)); // haar特征与lbp特征检测时间对比
        double et = (getTickCount() - st) / getTickFrequency();
        cout << "haar time consume : " << et << ", faces.size=" << faces.size() << endl; // haar time consume : 0.753811, faces.size=1
        for (size_t t = 0; t < faces.size(); t++) {
            rectangle(src_haar, faces[t], Scalar(255, 0, 0), 2, 8, 0);
        }
        imshow("src_haar", src_haar);

        st = getTickCount();
        // haar是浮点数计算,lbp是整型,所以lbp比haar识别快(可快一倍),建议优先使用lbp检测
        lbp_cascader.detectMultiScale(gray, faces, 1.1, 3, 0, Size(30, 30));
        et = (getTickCount() - st) / getTickFrequency();
        cout << "lbp time consume : " << et << ", faces.size=" << faces.size() << endl; // lbp time consume : 0.547446, faces.size = 1
        for (size_t t = 0; t < faces.size(); t++) {
            rectangle(src_lbp, faces[t], Scalar(255, 0, 0), 2, 8, 0);
        }
        imshow("src_lbp", src_lbp);

        waitKey(0);
    }

效果图

这里写图片描述

代码: 视频读取

    #include "../common/common.hpp"

    static CascadeClassifier haar_cascader;
    static CascadeClassifier lbp_cascader;
    static String haarfile = "project/workspace_vs/OpenCV310Sources_contrib/install/etc/haarcascades/haarcascade_frontalface_alt.xml"; // haar特征训练数据
    static String lbpfile = "project/workspace_vs/OpenCV310Sources_contrib/install/etc/lbpcascades/lbpcascade_frontalface.xml"; // lbp特征训练数据

    void main(int argc, char** argv) 
    {
        haar_cascader.load(getCVImagesPath(haarfile));
        lbp_cascader.load(getCVImagesPath(lbpfile));
        VideoCapture capture;
        Mat frame;
        Mat gray;
        vector<Rect> faces;
        capture.open(getCVImagesPath("images/sample.mp4")); // 打开本地视频文件

        double st, et;
        while (capture.read(frame)) // 读取视频中每一帧
        {
            cvtColor(frame, gray, COLOR_BGR2GRAY);
            st = getTickCount();
            equalizeHist(gray, gray);
            // 不管是haar还是lbp检测,都是第一次检测很慢,后续的检测时间会快一个数量级。 lbp检测比haar检测快将近一倍
            lbp_cascader.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30));
            et = (getTickCount() - st) / getTickFrequency();
            cout << "lbp time consume : " << et << ", faces.size=" << faces.size() << endl;
            for (size_t t = 0; t < faces.size(); t++) 
            {
                rectangle(frame, faces[t], Scalar(255, 0, 0), 2, 8, 0);
            }
            imshow("video detect", frame);
            if (waitKey(40) == 27) break; // ESC,视频是 25frame/s
        }
        capture.release(); // 释放资源

        waitKey(0);
    }

效果图

这里写图片描述

猜你喜欢

转载自blog.csdn.net/huanghuangjin/article/details/81392146