2016-12-12 1 views
0

Ich bin ein Anfänger Programmierer. Meine Erfahrung ist sehr klein. Jetzt habe ich einen Code, um Leute zu erkennen. Ich benutze SVM-Klassifikator und einen HOG-Deskriptor. Das Video wird sehr lange geladen und verarbeitet. Bitte helfen Sie mir bei diesem Problem.Video sehr lange Zeit zu laden. Opencv

#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; 
} 

Antwort

2

Erstellen Sie den Schweinedetektor nicht in jeder Iteration. Versuch:

#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; 
} 

Aber bedenken Sie, dass HoG Erkennung eine recht teure Operation ist. Wie ist die Auflösung deiner Bilder?

+0

Danke für die Antwort! Aber sobald das Video für eine lange Zeit zu booten. Videoauflösung 640 * 360. –

+0

Entschuldigung, ich verstehe nicht die Bedeutung Ihres Kommentars. Ist es schneller oder langsamer oder funktioniert es überhaupt nicht? – Micka

+0

Keine Änderungen im Video. –