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