opencv(Java)-matchTemplate未知异常



尝试使用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

起初,我认为这是源和样本之间的不匹配,但看看里面发生了什么似乎没问题?

我还可以尝试什么,或者如何从错误中获得更多信息来进一步调试它?

edit:所以我只是试着规范化我的输入,看看这是否有帮助,并注意到它在同一个输入上也崩溃了。我现在认为我只是错误地构建了源映像。

我正在使用捕获屏幕截图

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;
}
}

转换者可能对图像做了一些奇怪的事情吗?

因此,像我所做的那样提前关闭抓取器是导致问题的原因。我天真地认为,在使用convert函数时,我正在复制该值,不再需要打开它。

为了在保持应用程序结构的同时解决这个问题,我更新了take()方法:

@Override
@SneakyThrows
public Mat take() {
if (!grabber.isCloseInputStream()) {
grabber.stop();
}
grabber.start();
return toCore.convert(grabber.grabImage());
}

这将使抓取器框架打开以供进一步处理,但在拍摄另一张屏幕截图时将其关闭。

对于我的用例,我每50毫秒截屏一次,然后终止应用程序,这很好。这绝对不是每个用例的最佳方法,所以要小心盲复制粘贴:D

最新更新