话不多说先贴代码:

HOG+SVM:

#include <iostream> // for standard I/O
#include <string>   // for strings
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>     // Basic OpenCV structures (cv::Mat)
#include <opencv2/videoio.hpp>  // Video write
#include <opencv2/objdetect.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc,char * argv[]){
    VideoCapture inputVideo(0);
    HOGDescriptor hog;
    hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());    //设置SVM人体检测监测模型
    vector<Rect> rects;
    Mat src,gray;
    for (;;)
    {
        inputVideo >> src; 
        hog.detectMultiScale(gray, faces, 0, Size(8, 8), Size(32, 32), 1.05, 2);
//src监测画面,rects返回检测到所有的矩形,1.05缩放比例,越接近1越准确,越大检测速度越快,还有其他参数影响不是特别大,自行查找
        for (int i = 0;i < rects.size();i++) {
            rectangle(src, rects[i], Scalar(0, 255, 0));    //画矩形
        }
        imshow("test", src);
        waitKey(50);
    }
    return 0;
}

CascadeClassifier+Haar:

#include <iostream> // for standard I/O
#include <string>   // for strings
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>     // Basic OpenCV structures (cv::Mat)
#include <opencv2/videoio.hpp>  // Video write
#include <opencv2/objdetect.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc,char * argv[]){
    VideoCapture inputVideo(0);
    CascadeClassifier face_cascade;
    if (!face_cascade.load("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"))
    {
        cout << "--(!)Error loading face cascade\n";
        return -1;
    };
    vector<Rect> faces;
    Mat src,gray;
    for (;;)
    {
        inputVideo >> src;
        face_cascade.detectMultiScale(src, faces,1.05,3,0);
        for (int i = 0;i < faces.size();i++) {
            rectangle(src, faces[i], Scalar(0, 255, 0));
        }
        imshow("test", src);
        waitKey(50);
    }
    return 0;
}

CascadeClassifier+LBP:

#include <iostream> // for standard I/O
#include <string>   // for strings
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>     // Basic OpenCV structures (cv::Mat)
#include <opencv2/videoio.hpp>  // Video write
#include <opencv2/objdetect.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc,char * argv[]){
    VideoCapture inputVideo(0);
    CascadeClassifier face_cascade;
    if (!face_cascade.load("D:/opencv/sources/data/lbpcascades/lbpcascade_frontalface_improved.xml"))
    {
        cout << "--(!)Error loading face cascade\n";
        return -1;
    };
    vector<Rect> faces;
    Mat src,gray;
    for (;;)
    {
        inputVideo >> src;
        face_cascade.detectMultiScale(src, faces,1.05,3,0);
        for (int i = 0;i < faces.size();i++) {
            rectangle(src, faces[i], Scalar(0, 255, 0));
        }
        imshow("test", src);
        waitKey(50);
    }
    return 0;
}

细心的可能发现了,Haar和LBP除了模型不一样其他都一毛一样,是的,就是这样…

说明:

视频检测,显示都是特别花时间的处理,现在的目标检测库很多,不一定要使用OpenCV本身的,虽然我了解不多但还是可以凭我自己理解说一下。

OpenCV自身目标检测:

HOG+SVM:人体检测效果比较好,但是比较花时间

CascadeClassifier+Haar:速度比HOG要快一些

CascadeClassifier+LBP:速度快大概是Haar的两倍左右,精度差。

总是以上三种,各有千秋,算法什么的我也不太懂,自己调查吧。

第三方目标检测:

YOLO:自由,高效,对C语言有良好的支持,对于深度学习有了解的话可以试试…

InferenceEngine:大佬Intel的东西你懂的,需要搭配神经计算棒效果更佳,要花不少钱…

可以和OpenCV配合使用,很方便。

 

本文地址:https://blog.csdn.net/yuxipro/article/details/107274560