视频加载时间很长。 OpenCV的

时间:2016-12-12 09:16:04

标签: c++ opencv

我是新手程序员。我的经历很小。现在我有一个代码来检测人。我使用SVM分类器和HOG描述符。视频加载和处理的时间很长。请帮我解决这个问题。

#include <assert.h>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <conio.h>
#include "opencv2/opencv.hpp"


using namespace cv;
using namespace std;
int main()
{
string filename = "Street.MP4";
VideoCapture capture(filename);
Mat frame;
//namedWindow("w", 1);
while (true)
{
    capture >> frame;
    if (frame.empty())
        break;
    Mat img, res;
    Mat framecopy = frame.clone();
    resize(framecopy, img, Size(2 * framecopy.cols, 2 * framecopy.rows));
    int nbins = 9;
    Size cellSize(8, 8);
    Size blockSize(16, 16);
    Size blockStride(8, 8);
    Size winSize(64, 128);
    Size winStride(4, 4);
    HOGDescriptor hog(winSize, blockSize, blockStride, cellSize, nbins);
    hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    assert(hog.checkDetectorSize());
    vector<Rect> locations;
    vector<double> weights;
    hog.detectMultiScale(img, locations, weights, 0.0, winStride, Size(), 1.05, 2., true);
    resize(img, res, Size(framecopy.cols / 2, framecopy.rows / 2));
    for (size_t i = 0; i < locations.size(); ++i)
    {
        Rect detection = locations[i];
        detection.x /= 2;
        detection.y /= 2;
        detection.width /= 2;
        detection.height /= 2;
        rectangle(res, detection, Scalar(0, 0, 255), 2);
    }
    imshow("w", res);
    waitKey(20); // waits to display frame
}
waitKey();
return 0;
}

1 个答案:

答案 0 :(得分:2)

不要在每次迭代中创建猪检测器。 尝试:

#include <assert.h>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <conio.h>
#include "opencv2/opencv.hpp"


using namespace cv;
using namespace std;
int main()
{
    string filename = "Street.MP4";
    VideoCapture capture(filename);
    Mat frame;
    //namedWindow("w", 1);

    int nbins = 9;
    Size cellSize(8, 8);
    Size blockSize(16, 16);
    Size blockStride(8, 8);
    Size winSize(64, 128);
    Size winStride(4, 4);
    HOGDescriptor hog(winSize, blockSize, blockStride, cellSize, nbins);
    hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    assert(hog.checkDetectorSize());

    while (true)
    {
        capture >> frame;
        if (frame.empty())
            break;
        Mat img, res;
        Mat framecopy = frame.clone();
        resize(framecopy, img, Size(2 * framecopy.cols, 2 * framecopy.rows));

        vector<Rect> locations;
        vector<double> weights;
        hog.detectMultiScale(img, locations, weights, 0.0, winStride, Size(), 1.05, 2., true);
        resize(img, res, Size(framecopy.cols / 2, framecopy.rows / 2));
        for (size_t i = 0; i < locations.size(); ++i)
        {
            Rect detection = locations[i];
            detection.x /= 2;
            detection.y /= 2;
            detection.width /= 2;
            detection.height /= 2;
            rectangle(res, detection, Scalar(0, 0, 255), 2);
        }
        imshow("w", res);
        waitKey(1); // waits to display frame
    }
    waitKey();
    return 0;
}

但请记住,HoG检测是一项非常昂贵的操作。你图像的分辨率是多少?

相关问题