Compter les "blancs" pixels dans opencv image binaire (efficacement)
Je suis en train de compter les pixels blancs dans un OpenCV image binaire. Mon code est comme suit:
whitePixels = 0;
for (int i = 0; i < height; ++i)
for (int j = 0; j < width; ++j)
if (binary.at<int>(i, j) != 0)
++whitePixels;
Cependant, après profilage gprof, j'ai trouvé que c'est une très lent morceau de code, et un grand goulot d'étranglement dans le programme.
Est là une méthode qui peut calculer la valeur de même plus rapide?
- Avez-vous essayé de changer la hauteur et la largeur? Je veux dire en boucle sur la largeur et à la hauteur ? Cela peut améliorer la boucle, dépend de la façon dont l'image est mis en mémoire.
- Pouvez-vous accéder aux données d'image directement, au contraire, par ce en fonction de ()?
- Faire comme jrok suggère sera probablement plus rapide. Je me demande si cette entrée de la faq est pertinent.
- Merci à tous, je pense accès direct aux données doit être le chemin à parcourir. Et quelque chose me dit que la modification de l'ordre de la boucle sera plus rapide. Je vais lui donner un aller.
- La fonction() est TRÈS lent en mode Debug, même si c'est (presque) aussi vite que pointeur direct d'accès à la Libération. Il contient un CV_DbgAssert() pour vérifier les limites, ce qui est paresseux.
- Grand commentaire @vasile, je suis bien en mode débogage. Bon à savoir.
Vous devez vous connecter pour publier un commentaire.
cvCountNonZero
. Habituellement, le OpenCV la mise en œuvre d'une tâche est largement optimisé.cv::countNonZero
?Vous pouvez utiliser parallèle de l'informatique. La division de l'image en N parties et exécutez votre code dans différents threads ensuite, vous obtenez le résultat de chaque fils et après cela, vous pouvez ajouter ces résultats pour obtenir enfin la quantité.
Le dernier pixel d'une ligne est généralement suivie par le premier pixel de la ligne suivante (code C):
Fait
binary.at<int>(i, j)
est lente accès!Ici est simple code d'accès plus rapide que le vôtre.