首页 > 解决方案 > Java OpenCV 无法从 MatOfInt4 复制到 MatOfInt4

问题描述

我有一个 OpenCV 4.2.0 应用程序,它使用 HoughLinesP 来检测图像中的线条,该线条与 C++ 和 Objective-C 配合得很好。现在我需要在 Android 上为 java 提供相同的功能。  

我已经与它斗争了几天,并将其归结为以下问题。我无法使用 for 循环将值从一个 MatOfInt4 复制到另一个 MatOfInt4lines2.put(i,0, lines.get(i, 0));

下面是一段代码和日志输出。没有编译器错误或运行时错误,只是没有保存在 lines2 目标 MatOfInt4 中的值。要么我误解了 put 方法的工作原理,要么还有其他问题。

有谁知道这可能会出错?任何具有 Java 和 OpenCV 的专家能够对下面的代码提供任何指导或更正以使其正常工作?

您可以看到行有 180 个条目,for 循环计数 180 个循环,但 lines2 在完成时为空。我可以get()从行中正确地获取值,并且我在代码的其他部分中使用这些值,但是我不能put()在行 2 中添加任何内容。

MatOfInt4 lines = new MatOfInt4();

lines = houghLinesP(sub);

Log.i(TAG, "Total Sub Lines Returned: " + lines.size());

MatOfInt4 lines2 = new MatOfInt4();

for(int i = 0; i <  lines.rows(); i++) {

    lines2.put(i,0, lines.get(i, 0));

    Log.i(TAG, "Count of loop: " + i);
}

Log.i(TAG, "Dump of lines2 Returned: " + lines2.dump());

Log.i(TAG, "Total Lines2 Returned: " + lines2.size());

测试代码结果:

返回的子行总数:1x180

转储行2返回:[]

循环次数:180

返回的总行数2:0x0

任何帮助或指导将不胜感激。

标签: javaandroidopencv

解决方案


lines2矩阵没有大小,因此您无法在其中设置值。为了解决这个问题,您可以分配适当大小的矩阵,例如

MatOfInt4 lines2 = new MatOfInt4();
lines2.create(1,lines.rows(), lines.type());

// alternatively:
Mat lines2 = new Mat(1,lines.rows(), lines.type());

如果您在循环中不做任何其他事情,您也可以转置矩阵以获得相同的结果:

Mat lines2 = lines.t();

这个转置矩阵将已经包含正确的值。对于我的示例图像,这会产生以下输出:

Total Sub Lines Returned: 1x295
Dump of lines2 Returned: [9, 187, 137, 201, 353, 211, 430, 213, 95, etc...
Total Lines2 Returned: 295x1

推荐阅读