opencv (Java) - matchTemplate 未知异常
opencv (Java) - matchTemplate unknown exception
尝试使用 org.opencv.imgproc
中的 matchTemplate 方法,但抛出 java.lang.Exception: unknown exception
没有其他细节。
我是这样调用的:
private Mat matchTemplate(final Mat source) {
final Mat sample = loadTemplate();
final Mat result = new Mat();
Imgproc.matchTemplate(source, sample, result, Imgproc.TM_CCOEFF_NORMED);
Imgproc.threshold(result, result, 0.1, 1, Imgproc.THRESH_TOZERO);
return result;
}
进入模板的值是:
- 来源:
Mat [ 1440*2560*CV_8UC3, isCont=true, isSubmat=false
- 示例:
Mat [ 22*46*CV_8UC3, isCont=true, isSubmat=false
- 结果:
Mat [ -1*-1*CV_8UC1, isCont=false, isSubmat=false
起初,我认为这是源代码和样本之间的不匹配,但看看里面发生了什么似乎没问题?
我还能尝试什么或如何从错误中获取更多信息以进一步调试?
编辑:
所以我只是尝试规范化我的输入,看看是否有帮助,并注意到它在同一输入上也崩溃了。我现在想我只是错误地构建了源图像。
我正在使用以下方式截取屏幕截图:
public class ScreenshotServiceImpl implements ScreenshotService {
private final FFmpegFrameGrabber grabber;
private final ToOrgOpenCvCoreMat toCore = new ToOrgOpenCvCoreMat();
@Override
@SneakyThrows
public Mat take() {
grabber.start();
final Mat output = toCore.convert(grabber.grab());
grabber.stop();
return output;
}
}
转换是否可能对图像做了一些奇怪的事情?
原来像我一样提前关闭抓取器是导致问题的原因。我天真地假设在使用转换函数时我正在复制该值并且不再需要它打开。
为了在保持我的应用程序结构的同时解决这个问题,我更新了 take()
方法:
@Override
@SneakyThrows
public Mat take() {
if (!grabber.isCloseInputStream()) {
grabber.stop();
}
grabber.start();
return toCore.convert(grabber.grabImage());
}
这将使抓取框架保持打开状态以供进一步处理,但在拍摄另一张屏幕截图时将其关闭。
对于我每 50 毫秒截屏一段时间然后终止应用程序的用例,这很好。这绝对不是每个用例的最佳方法,所以要小心盲目复制粘贴:D
尝试使用 org.opencv.imgproc
中的 matchTemplate 方法,但抛出 java.lang.Exception: unknown exception
没有其他细节。
我是这样调用的:
private Mat matchTemplate(final Mat source) {
final Mat sample = loadTemplate();
final Mat result = new Mat();
Imgproc.matchTemplate(source, sample, result, Imgproc.TM_CCOEFF_NORMED);
Imgproc.threshold(result, result, 0.1, 1, Imgproc.THRESH_TOZERO);
return result;
}
进入模板的值是:
- 来源:
Mat [ 1440*2560*CV_8UC3, isCont=true, isSubmat=false
- 示例:
Mat [ 22*46*CV_8UC3, isCont=true, isSubmat=false
- 结果:
Mat [ -1*-1*CV_8UC1, isCont=false, isSubmat=false
起初,我认为这是源代码和样本之间的不匹配,但看看里面发生了什么似乎没问题?
我还能尝试什么或如何从错误中获取更多信息以进一步调试?
编辑: 所以我只是尝试规范化我的输入,看看是否有帮助,并注意到它在同一输入上也崩溃了。我现在想我只是错误地构建了源图像。
我正在使用以下方式截取屏幕截图:
public class ScreenshotServiceImpl implements ScreenshotService {
private final FFmpegFrameGrabber grabber;
private final ToOrgOpenCvCoreMat toCore = new ToOrgOpenCvCoreMat();
@Override
@SneakyThrows
public Mat take() {
grabber.start();
final Mat output = toCore.convert(grabber.grab());
grabber.stop();
return output;
}
}
转换是否可能对图像做了一些奇怪的事情?
原来像我一样提前关闭抓取器是导致问题的原因。我天真地假设在使用转换函数时我正在复制该值并且不再需要它打开。
为了在保持我的应用程序结构的同时解决这个问题,我更新了 take()
方法:
@Override
@SneakyThrows
public Mat take() {
if (!grabber.isCloseInputStream()) {
grabber.stop();
}
grabber.start();
return toCore.convert(grabber.grabImage());
}
这将使抓取框架保持打开状态以供进一步处理,但在拍摄另一张屏幕截图时将其关闭。
对于我每 50 毫秒截屏一段时间然后终止应用程序的用例,这很好。这绝对不是每个用例的最佳方法,所以要小心盲目复制粘贴:D