我有一个使用HoughLinesP的OpenCV 4.2.0应用程序,用于检测在C++和Objective-C正常工作的图像中的行。现在,我需要具有与Android上的Java相同的功能。
我已经与之抗争了两天,并将其归结为以下问题。我无法使用带有lines2.put(i,0, lines.get(i, 0));的for循环将值从一个MatOfInt4复制到另一个MatOfInt4
以下是一段代码和日志输出。没有编译器错误或运行时错误,只有行2目标MatOfInt4中没有保存任何值。我可能误解了put方法的工作方式,或者还有其他问题。
有人知道这可能出问题吗?任何使用Java和OpenCV的专家都能对下面的代码给出任何指导或更正,以使其正常工作吗?
您可以看到各行有180个条目,for循环计数180个循环,但完成时lines2为空。我可以从行中正确地对get()值,并且在代码的其他部分中使用值,但是我不能对任何内容put()到lines2中。

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
任何帮助或指导将不胜感激。

最佳答案

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

07-24 13:58