欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[ 深度学习 | OpenCV ] OpenCV开发二(物体监测)

程序员文章站 2022-06-23 21:27:05
话不多说先贴代码:HOG+SVM:#include // for standard I/O#include // for strings#include #include // Basic OpenCV structures (cv::Mat)#include ...

话不多说先贴代码:

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