Подсчет «белых» пикселей в двоичном изображении opencv (эффективно) - PullRequest
7 голосов
/ 07 декабря 2011

Я пытаюсь сосчитать все белые пиксели в двоичном изображении OpenCV. Мой текущий код выглядит следующим образом:

  whitePixels = 0;
  for (int i = 0; i < height; ++i)
    for (int j = 0; j < width; ++j)
      if (binary.at<int>(i, j) != 0)
        ++whitePixels;

Однако после профилирования с помощью gprof я обнаружил, что это очень медленный кусок кода и большое узкое место в программе.

Есть ли метод, который может вычислить то же значение быстрее?

Ответы [ 4 ]

22 голосов
/ 07 декабря 2011

cvCountNonZero.Обычно реализация задачи OpenCV сильно оптимизирована.

0 голосов
/ 24 ноября 2012

На самом деле binary.at<int>(i, j) медленный доступ!

Вот простой код, доступ к которому быстрее, чем у вас.

for (int i = 0; i < height; ++i)
{
uchar * pixel = image.ptr<uchar>(i);
    for (int j = 0; j < width; ++j)
{
  if(pixel[j]!=0)
   {
      //do your job
   }
}
}
0 голосов
/ 10 декабря 2011

За последним пикселем в строке обычно следует первый пиксель в следующей строке (код C):

limit=width*height;
i=0;
while (i<limit)
{
  if (binary.at<int>(0,i) != 0) ++whitePixels;
  ++i;
}
0 голосов
/ 07 декабря 2011

Вы можете использовать параллельные вычисления. Вы делите изображение на N частей и запускаете свой код в разных потоках, затем вы получаете результат каждого потока, и после этого вы можете добавить эти результаты для получения окончательной суммы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...