java - Java OpenCV无法从MatOfInt4复制到MatOfInt4

标签 java android opencv

我有一个使用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

关于java - Java OpenCV无法从MatOfInt4复制到MatOfInt4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62401365/

相关文章:

java - 使用ajax v java 获取请求

Java - ServerSocket accept() 方法在 while(true) 循环中重复

android - 在 Android 中加载谷歌地图中的当前位置并不快

Intent 不为空时的 Android "Failure delivering result ResultInfo"

android - 在 AsyncTask 的帮助下从 List 数组向 Google Maps API v2 添加多个标记

c - opencv的cvSaveImage函数源代码

java - 比较两个不同长度的数组

java - 如何在包含 main() 的类的其他方法中使用在 main() 中声明的键盘输入?

python - 在 ubuntu 上使用 Anaconda for python 3.4 安装 opencv

c++ - 单个多对象卡尔曼滤波器与多个单对象卡尔曼滤波器(复数)