OpenCV: comment utiliser HOGDescriptor:: méthode de détection?

j'ai réussi à suivre les objets en mouvement dans une vidéo. http://ww1.sinaimg.cn/mw690/63a9e398jw1ecn39e3togj20jv0g1gnv.jpg

cependant je veux décider si un objet est une personne ou non. J'ai essayé le HOGDescriptor dans OpenCV. HOGDescriptor a deux méthodes pour détecter les personnes: HOGDescriptor::detect et HOGDescriptor::detectMultiScale. OpenCV "sourcessamplesrpcpeopledetect.rpc" montre comment utiliser HOGDescriptor::detectMultiScale , qui recherche autour de l'image à échelle différente, et est très lent.

Dans mon cas, j'ai suivi les objets dans un rectangle. Je pense à l'aide de HOGDescriptor::detect pour détecter l'intérieur du rectangle sera beaucoup plus rapidement. Mais le document OpenCV n'a que le gpu::HOGDescriptor::detect (je n'arrive toujours pas à deviner comment l'utiliser) et a raté HOGDescriptor::detect. Je veux utiliser HOGDescriptor::detect.

Quelqu'un pourrait-il me fournir un extrait de code C++ démontrant l'utilisation de HOGDescriptor::detect?

merci.

10
demandé sur gouchaoer 2014-01-17 22:15:09

2 réponses

Puisque vous avez déjà une liste d'objets, vous pouvez appeler le HOGDescriptor::detect méthode pour tous les objets et vérifiez la sortie foundLocations array. S'il n'est pas vide, l'objet est classé comme personne. La seule chose, c'est que les PORCS fonctionne avec 64x128 windows par défaut, si vous avez besoin de redimensionner vos objets:

std::vector<cv::Rect> movingObjects = ...;

cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
std::vector<cv::Point> foundLocations;
for (size_t i = 0; i < movingObjects.size(); ++i)
{
    cv::Mat roi = image(movingObjects[i]);
    cv::Mat window;
    cv::resize(roi, window, cv::Size(64, 128));
    hog.detect(window, foundLocations);
    if (!foundLocations.empty())
    {
        // movingObjects[i] is a person
    }
}
11
répondu jet47 2016-06-27 11:47:27
  • Si vous n'avez pas cmake OpenCV CUDA activé, l'appel de gpu::HOGDescriptor::detect sera égal à appeler HOGDescriptor::detect. Aucun GPU n'est appelé.

  • Aussi, pour le code, vous pouvez utiliser

    GpuMat img;
    vector<Point> found_locations;
    gpu::HOGDescriptor::detect(img, found_locations);
    if(!found_locations.empty())
    {
        // img contains/is a real person 
    }
    

Edit:

cependant je veux décider si un objet est une personne ou non.

Je ne pense pas que vous ayez besoin de cette étape. HOGDescriptor::detect lui-même est utilisé pour détecter les gens, donc vous n'avez pas besoin pour les vérifier comme ils sont censés être des personnes selon votre installation. D'un autre côté, vous pouvez configurer son seuil pour contrôler sa qualité détectée.

1
répondu herohuyongtao 2014-01-18 05:27:46