【问题标题】:OpenCV ptr in JavaJava中的OpenCV ptr
【发布时间】:2018-10-23 19:13:55
【问题描述】:

我想知道如何用 Java 制作这个 opencv c++ 代码

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

我一直在环顾四周,我想我可以将 uchar 用作字节......但我不知道在 java 中获取 .ptr 的代码是什么

这是我目前的代码

private Rect getEyeball(Mat eye, MatOfRect circles) {
    int[] sums = new int[circles.toArray().length];

    for (int y = 0; y < eye.rows(); y++) {
        // OpenCV method uchar *ptr = eye.ptr<uchar>(y); Goes here 
    }

    int smallestSum = 9999999;
    int smallestSumIndex = -1;

    for (int i = 0; i < circles.toArray().length; i++) {
        if (sums[i] < smallestSum) {
            smallestSum = sums[i];
            smallestSumIndex = i;
        }
    }

    return circles.toArray()[smallestSumIndex];
}

完整的C++代码是

cv::Vec3f 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];
}

【问题讨论】:

  • 收到ptr 后,您实际上想做什么?沿行求和?
  • (请注意,如果是这种情况,您实际上并不需要 sums 数组)
  • (而Integer.MAX_VALUEsmallestSum 的更稳健的初始值;尽管最好再次使用i == 0 的总和,以防所有行总和为Integer.MAX_VALUE
  • 是的,我已经添加了 C++ 代码
  • (格式化很麻烦)

标签: java c++ opencv


【解决方案1】:

提炼你的 C++:

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);
      // A loop not using ptr.
      ++ptr;
    }
}

您只是从eye 获取 (x,y) 处的像素值。

所以,只需使用Mat.get 的重载之一。

int[] values = new int[eye.channels()];
for (int y = 0; y < eye.rows(); y++) {
  for (int x = 0; x < eye.cols(); x++) {
    eye.get(x, y, values);
    int value = values[0];

    // A loop not using ptr.
  }
}

请注意,在这里使用get(int, int, int[]) 而不是get(int, int) 意味着您可以避免为每次迭代分配一个新数组,这会使事情快得多。

【讨论】:

  • 你好安迪,我也在尝试读取 java 中的 opencv_core.Mat 值。我有 rows(), cols() 方法,但任何版本的 .get() 方法似乎在我的最后都丢失了。我是新手,你能帮我知道我应该怎么做吗? stackoverflow.com/questions/62443053/…
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
相关资源
最近更新 更多