java - OpenCV:minMaxLoc没有给出最小/最大值

标签 java opencv image-processing template-matching javacpp

我正在尝试使用OpenCV tutorial on image template matching跟随javacpp-presets
我想丢掉得分太低的比赛,但minMaxLoc似乎不返回minValmaxVal

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)是:
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的内容?

最佳答案

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

Default constructor that does nothing.



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

它不指向任何double,但是文档告诉您DoublePointer还有另一个构造函数
public DoublePointer(long size)

表示它分配了这个大小的数组。如果size等于1,则相当于在C++中等于:
double p[1];

或基本上
double *p = new double;

我从未使用过JavaCpp,因此,如果我错过了一些事情,请发表评论。

关于java - OpenCV:minMaxLoc没有给出最小/最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51654336/

相关文章:

java - 使用 Flying Saucer PDF 渲染将格式错误的 HTML 转换为 PDF

opencv - 如何在2点之间找到白色/黑色像素javacv

c++ - 无法从源代码构建 OpenCV

c# - 不安全边缘检测仍然很慢

java - 如何在java中使用以下curl post命令?

java - 如何实现通过 RestTemplate 执行的 PATCH?

c# - 在 C# 中检测相机图像中的对象

image - 需要自动消除图像和物体外边界的噪声

java - 需要从CSV文件中提取数据

c# - 尝试初始化新图像 <> 时,EmguCV 343 缺少 dll "cvextern.dll"