1

我正在尝试使用javacpp-presets遵循有关图像模板匹配的 OpenCV 教程。我想扔掉分数太低但似乎没有返回的比赛,并且.minMaxLocminValmaxVal

import org.bytedeco.javacpp.DoublePointer;
import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacpp.opencv_core.Point;

import static org.bytedeco.javacpp.opencv_core.CV_32FC1;
import static org.bytedeco.javacpp.opencv_core.NORM_MINMAX;
import static org.bytedeco.javacpp.opencv_core.minMaxLoc;
import static org.bytedeco.javacpp.opencv_core.normalize;
import static org.bytedeco.javacpp.opencv_imgcodecs.IMREAD_COLOR;
import static org.bytedeco.javacpp.opencv_imgcodecs.imread;
import static org.bytedeco.javacpp.opencv_imgproc.TM_CCOEFF_NORMED;
import static org.bytedeco.javacpp.opencv_imgproc.matchTemplate;

public class MatchTemp {

    public static void match(String img, String temp) {

        Mat image = imread(img, IMREAD_COLOR);
        Mat template = imread(temp, IMREAD_COLOR);

        int resultRows = image.rows() - template.rows() + 1;
        int resultCols = image.cols() - template.cols() + 1;
        Mat result = new Mat(resultRows, resultCols, CV_32FC1);

        matchTemplate(image, template, result, TM_CCOEFF_NORMED);

        Mat normalizedResult = new Mat();
        normalize(result, normalizedResult, 0, 1, NORM_MINMAX, -1, new Mat());

        DoublePointer maxVal = new DoublePointer();
        DoublePointer minVal = new DoublePointer();
        Point minLoc = new Point();
        Point maxLoc = new Point();

        minMaxLoc(normalizedResult, minVal, maxVal, minLoc, maxLoc, null);

        System.out.println("min: "+minLoc.x()+", "+minLoc.y());
        System.out.println("max: "+maxLoc.x()+", "+maxLoc.y());

        minVal.get(); // this throws exception
        maxVal.get(); // this throws exception
    }
}

例外是:

Exception in thread "main" java.lang.NullPointerException: This pointer address is NULL.
    at org.bytedeco.javacpp.DoublePointer.get(Native Method)
    at org.bytedeco.javacpp.DoublePointer.get(DoublePointer.java:101)
    ...

我究竟做错了什么?我怎样才能得到分数?我必须手动检查内容Mat吗?

4

1 回答 1

1

该错误告诉您它正在尝试访问 Null 引用。阅读说明查看Pointer.Pointer()的DoublePointer 构造函数的文档,它基本上告诉您以下内容:

什么都不做的默认构造函数。

这意味着它只是一个类似于 C++ 的指针:

double *p;

它不指向任何双精度,但文档告诉您 DoublePointer 有另一个构造函数

public DoublePointer(long size)

它说它分配了一个这个大小的数组。如果 size 等于 1,则相当于在 C++ 中说这相当于:

double p[1];

或者基本上

double *p = new double;

我从未使用过 JavaCpp,所以如果我遗漏了什么,请发表评论。

于 2018-08-02T17:02:02.747 回答