Member 14092842 Ответов: 2

Как перевести код opencv C++, содержащий указатели на JAVA?


cv::Mat getEyeball(cv::Mat &eye, std::vector<cv::Vec3f> &circles)
{
  std::vector<int> sums(circles.size(), 0);
  for (int y = 0; y < eye.rows; y++)
  {
  uchar *ptr = eye.ptr<uchar>(y); 
      for (int x = 0; x < eye.cols; x++)
      {
          int value = static_cast<int>(*ptr);
          for (int i = 0; i < circles.size(); i++)
          {
              cv::Point center((int)std::round(circles[i][0]), (int)std::round(circles[i][1]));
              int radius = (int)std::round(circles[i][2]);
              if (std::pow(x - center.x, 2) + std::pow(y - center.y, 2) < std::pow(radius, 2))
              {
                  sums[i] += value;
              }
          }
          ++ptr;
      }
  }
  int smallestSum = 9999999;
  int smallestSumIndex = -1;
  for (int i = 0; i < circles.size(); i++)
  {
      if (sums[i] < smallestSum)
      {
          smallestSum = sums[i];
          smallestSumIndex = i;
      }
  }
  return circles[smallestSumIndex];
}


Что я уже пробовал:

единственный код, который я не могу понять
uchar *ptr = eye.ptr<uchar>(y);
и
int value = static_cast<int>(*ptr);
не могли бы вы рассказать мне, как эти строки кода используются для меня и как перевести их на язык программирования java?

2 Ответов

Рейтинг:
1

Richard MacCutchan

uchar *ptr = eye.ptr<uchar>(y);

То ptr функция принимает целочисленный параметр (y) и возвращает указатель на массив беззнаковых символов.
int value = static_cast<int>(*ptr);

Символ, на который указывает указатель, приводится к целочисленному значению. Затем он добавляется к элементу массива sums в следующем цикле.


Рейтинг:
1

KarstenK

Оба эти утверждения кажутся мне странными. Неправильное приведение от значения к указателю, а затем переделка в значение. Этот странный бросок в а uchar ограничивает максимальное значение до 255, и поэтому является ошибкой для большего y. Почему бы не использовать прямое назначение:

int value = y;