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.