• OpenCV人形检测Hog


    #include "iostream"
    #include "queue"
    using namespace std;
    #include "opencv2/opencv.hpp"
    #include "Windows.h"
    #include "opencv2/core/core.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/objdetect/objdetect.hpp"
    using namespace cv;
    
    int main()
    {
        try{
    
            IplImage *pFrame = NULL;
            CvCapture *pCapture = NULL;
            //pCapture = cvCreateCameraCapture(-1);
            //pCapture = cvCaptureFromCAM(0);
            pCapture = cvCaptureFromFile("C:\C_C++ code\Photo and video\TextVideo2.flv");
            //pCapture = cvCaptureFromFile("C:\C_C++ code\Photo and video\TextVideo1.flv");
            if (!pCapture)
            {
                cout << "File opened fail..." << endl;
                return -1;
            }
    
            Mat img;
            HOGDescriptor hog;
            Rect r;
            int nNum = 0;
            hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
            vector<Rect> found,found1;
            int i, j;
            char str[100];
            while (pFrame = cvQueryFrame(pCapture))
            {
                nNum++;
                Mat img = cvarrToMat(pFrame, 0); //IplImage turn into Mat
                
                if (nNum >= 3)
                {
                    //进行检测
                    hog.detectMultiScale(img, found);
    
                    found1.clear();
                    //-------------------去除嵌套的矩形框------------------------
                    for (i = 0; i < found.size(); i++)
                    {
                        r = found[i];
                        for (j = 0; j < found.size(); j++)
                        {
                            if ( i != j && ((r&found[j]) == r) )
                            {
                                break;
                            }
                        }
                        if (j == found.size())
                        {
                            found1.push_back(r);
                        }
                    }
                    //画长方形 框出行人
    
                    for (i = 0; i < found1.size(); i++)
                    {
                        r = found1[i];
                        rectangle(img, r, Scalar(0, 255, 0), 1);
                    }
                    nNum = 0;
                }
                
                for (int i = 0; i < found1.size(); i++)
                {
                    r = found1[i];
                    rectangle(img, r, Scalar(0, 255, 0), 1);
                }
                sprintf(str, "The track count is: %d", found1.size());
                
                putText(img, str, cvPoint(30, 30), CV_FONT_HERSHEY_PLAIN, 0.8,CV_RGB(0, 0, 250),1,8);
            
                imshow("Track People", img);
                if (cvWaitKey(35) >= 0)
                    break;
            }
        }
        catch (exception &e)
        {
            cout << e.what() << endl;
        }
    
        return 1;
    }

    效果:

    图片人形测试:

    #include "iostream"
    #include "queue"
    using namespace std;
    #include "opencv2/opencv.hpp"
    #include "Windows.h"
    #include "opencv2/core/core.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/objdetect/objdetect.hpp"
    int main(int argc, char** argv){
        Mat img;
        vector<Rect> found;
    
        img = imread("C:\C_C++ code\Photo and video\text006.jpg");
    
        HOGDescriptor defaultHog;
        defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    
        //进行检测
        defaultHog.detectMultiScale(img, found);
    
        //画长方形,框出行人
        for (int i = 0; i < found.size(); i++){
            Rect r = found[i];
            rectangle(img, r, Scalar(0, 255, 0), 1);
        }
        namedWindow("检测行人", CV_WINDOW_AUTOSIZE);
        imshow("检测行人", img);
    
        waitKey(0);
    
        return 0;
    }

    边框嵌套去重:

    int main(int argc, char** argv){
        Mat img;
        vector<Rect> found, foundRect;
    
        img = imread("C:\C_C++ code\Photo and video\text007.jpg");
    
        HOGDescriptor defaultHog;
        defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    
        //进行检测
        defaultHog.detectMultiScale(img, found);
    
        //遍历found寻找没有被嵌套的长方形
        for (int i = 0; i < found.size(); i++){
            Rect r = found[i];
    
            int j = 0;
            for (; j < found.size(); j++){
                //如果时嵌套的就推出循环
                if (j != i && (r & found[j]) == r)
                    break;
            }
            if (j == found.size()){
                foundRect.push_back(r);
            }
        }
    
        //画长方形,圈出行人
        for (int i = 0; i < foundRect.size(); i++){
            Rect r = foundRect[i];
            rectangle(img, r.tl(), r.br(), Scalar(0, 0, 255), 3);
        }
    
        namedWindow("检测行人", CV_WINDOW_AUTOSIZE);
        imshow("检测行人", img);
    
        waitKey(0);
        return 0;
    }
    int main()
    {
        Mat image = imread("C:\C_C++ code\Photo and video\text007jpg");
        imshow("hog", image);
        if (image.empty())
        {
            cout << "read image failed" << endl;
        }
        // 1. 定义HOG对象    
        HOGDescriptor hog(Size(48,96), Size(16, 16), Size(8, 8), Size(8, 8), 9);
    
    
        // 2. 设置SVM分类器    
        hog.setSVMDetector(HOGDescriptor::getDaimlerPeopleDetector());   // 采用已经训练好的行人检测分类器    
    
        // 3. 在测试图像上检测行人区域    
        std::vector<cv::Rect> regions;
        hog.detectMultiScale(image, regions, 0, cv::Size(8, 8), cv::Size(32, 32), 1.05, 1);
    
        // 显示    
        for (size_t i = 0; i < regions.size(); i++)
        {
            cv::rectangle(image, regions[i], cv::Scalar(0, 0, 255), 2);
        }
    
        cv::imshow("hog", image);
        cv::waitKey(0);
    
        return 0;
    }
  • 相关阅读:
    Redis
    cz_health_day13项目实战
    cz_health_day11
    cz_health_day10
    cz_health_day09
    cz_health_day08
    MySQL8管理系列之二:从5.5升级到8的问题处理
    MySQL8管理系列之一:Mysql 8.0以后版本的安装
    MySQL 5.5.x 数据库导入到 8.0.x 服务器
    修改Mysql 8.0版本的默认数据库目录
  • 原文地址:https://www.cnblogs.com/mypsq/p/4992547.html
Copyright © 2020-2023  润新知