OpenCV: comment utiliser HOGDescriptor:: méthode de détection?
j'ai réussi à suivre les objets en mouvement dans une vidéo.
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.
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
}
}
Si vous n'avez pas cmake OpenCV
CUDA
activé, l'appel degpu::HOGDescriptor::detect
sera égal à appelerHOGDescriptor::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.