OpenCV: minMaxLoc не дает значения min / max
Я пытаюсь следовать руководству OpenCV по сопоставлению шаблонов изображений с использованием javacpp-presets. Я хочу выбрасывать матчи со слишком низким счетом, но minMaxLoc
кажется, не вернуться minVal
а также maxVal
,
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
?
1 ответ
Ошибка говорит вам, что он пытается получить доступ к нулевой ссылке. Читая документацию конструктора DoublePointer, который говорит, что нужно смотреть на Pointer.Pointer(), он в основном говорит вам следующее:
Конструктор по умолчанию, который ничего не делает.
Это означает, что это просто указатель, похожий на C++:
double *p;
Который не указывает ни на какой double, но документация говорит вам, что есть другой конструктор для DoublePointer
public DoublePointer(long size)
который говорит, что он выделяет массив этого размера. Если размер равен 1, это эквивалентно тому, что в C++ это эквивалентно:
double p[1];
или в основном
double *p = new double;
Я никогда не использовал JavaCpp, поэтому, если я что-то пропустил, пожалуйста, оставьте комментарий.