【问题标题】:java opencv Features2d.drawMatches - Assertion failure or NullPointerExceptionjava opencv Features2d.drawMatches - 断言失败或 NullPointerException
【发布时间】:2018-05-28 18:50:12
【问题描述】:

我正在尝试使用 openCV java API 中的 Features2d.drawMatches 方法创建一个图像,描绘从 sift 文件生成的图像中的关键点之间的匹配。我似乎无法弄清楚该方法将采用哪种参数作为输出参数 - 我不断收到以下断言错误:

OpenCV(3.4.1) Error: Assertion failed (!outImage.empty()) in 
cv::drawKeypoints, file C:\build\master_winpack-bindings-win32-vc14- 
static\opencv\modules\features2d\src\draw.cpp, line 115
Exception in thread "main" CvException [org.opencv.core.CvException:  
cv::Exception: OpenCV(3.4.1) C:\build\master_winpack-bindings-win32-vc14- 
static\opencv\modules\features2d\src\draw.cpp:115: error: (-215) 
!outImage.empty() in function cv::drawKeypoints
]
    at org.opencv.features2d.Features2d.drawMatches_1(Native Method)
    at org.opencv.features2d.Features2d.drawMatches(Features2d.java:71)
    at com.company.GUI.ImagesView.matchPoints(ImagesView.java:94)
    at com.company.GUI.ImagesView.<init>(ImagesView.java:69)
    at com.company.Main.main(Main.java:17)

我的代码:

private void matchPoints() {
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    MatOfKeyPoint matKey1 = new MatOfKeyPoint(keyPoints1);
    MatOfKeyPoint matKey2 = new MatOfKeyPoint(keyPoints2);
    MatOfDMatch matDMatch = new MatOfDMatch(matches);
    Mat output = new Mat();
    //output = new Mat(matKey1.rows(), matKey1.cols(), CvType.CV_8U, Scalar.all(0));
    if (!output.empty())
        System.out.println("not empty");
    else
        System.out.println("empty");
    Features2d.drawMatches(mat1, matKey1, mat2, matKey2, matDMatch, output);
    HighGui.imshow("Matches", output);
}

无论我是否取消注释注释行,都会显示完全相同的断言错误,尽管下面的 empty() 检查为这两个 Mats 返回了不同的值。我不知所措,不胜感激。

【问题讨论】:

  • mat1mat2 都是 3 通道图像,还是灰度图像? FWIW matKey1 的行数和列数肯定与图像的输出大小不同。关键点是在水平连接的图像上绘制的,因此您将获得图像宽度之和作为输出宽度,然后两个图像高度的最大值将是输出图像的高度。但是,这无关紧要---AFAIK,您应该能够像在上面的代码中那样仅从默认构造函数传递输出。
  • 感谢您的帮助! mat1 和 mat2 都是 3 通道。是的,你绝对是对的——当我试图摆脱那个讨厌的断言时,我并没有太在意它(我去检查以防万一,但它没有改变任何东西)。该错误可能是由依赖配置引起的,还是有可能是 java openCV 错误?
  • 是的,我不确定,我没有为 Java 编译 OpenCV。希望我能提供更多帮助,但否则您的代码看起来像文档和示例似乎显示的那样,所以我没有想法。您可以尝试将这两个图像实际填充到Mat(复制到输出图像内的 ROI)并将标志更改为正确的,以便仅在输出图像顶部绘制而不是添加图像。
  • 我认为问题可能出在您的比赛中,您是如何计算比赛的?

标签: java opencv opencv-features2d


【解决方案1】:

我无法评论,所以我必须写一个答案:
我有同样的问题并以某种方式解决了它。这不是依赖错误 - 我在不更改依赖项(或导入的库)的情况下解决了它。
如果匹配计算正确,则调用此函数时不会出现此特定错误。
在我的代码中,错误是计算函数的调用。我尝试使用 FastFeatureDetector 调用此函数 - 但我在某处读到此检测器找不到任何匹配项。

尝试计算
ORB extractor = ORB.create();<br>extractor.compute(currentFrame, keyPoints, imgDescriptor);

在尝试计算 imgDescriptor 时,不应出现错误;匹配后,您应该能够绘制匹配项。
希望,我帮助了你或其他任何人为这种错误而苦苦挣扎。

【讨论】:

    猜你喜欢
    • 2014-02-10
    • 2012-11-26
    • 2014-11-24
    • 2014-05-28
    • 2020-12-31
    • 2015-09-12
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多