使 HoughLinesP 在 JavaCV 中工作的现代方法

Contemporary way to make HoughLinesP work in JavaCV

所以,似乎 API 随着时间的推移发生了变化。

我达到了

import org.bytedeco.javacpp.opencv_core.{Mat, Point, Scalar}
import org.bytedeco.javacpp.{opencv_core, opencv_imgcodecs, opencv_imgproc}

val mat         = opencv_imgcodecs.imread("test-in.jpg")
val greyMat     = new Mat()
val lines       = new Mat()
opencv_imgproc.cvtColor(mat, greyMat, opencv_imgproc.CV_BGR2GRAY, 1)
val rho         = 1.0
val theta       = 1.0.toRadians
val thresh      = 50
val minLineLen  = 80
val maxLineGap  = 50

opencv_imgproc.HoughLinesP(greyMat, lines, rho, theta, thresh,
  minLineLen, maxLineGap)

for (i <- 0 until lines.rows()) {
  val pt1   = ??? : Point
  val pt2   = ??? : Point
  val colr  = new Scalar(0, 0, 255, 128)

  opencv_imgproc.line(mat, pt1, pt2, colr, 1, opencv_core.LINE_AA, 0)
}

opencv_imgcodecs.imwrite("test-out.jpg", mat)

但我不知道如何从 lines 矩阵中提取点。 例如,this old post 暗示有 MatOfInt4 之类的东西,但我没有找到。此外,还有一个答案说我可以在 Mat 上执行 lines.get(0, x),一种不存在的方法。

然后我发现 another variant 使用了 UByteRawIndexer,但我矩阵中的单元格具有三个而不是四个元素(这可能是因为我调用 HoughLinesP 而不是 HoughLines).

那么我到底是怎么从 HoughLinesP 通话中获得积分的呢? JavaCV 是 1.2,OpenCV 是 3.1.


如果我查询 lines 矩阵的大小,我得到 rows = 19167, cols = 1;我创建了一个看起来是 UByteRawIndexerIndexer,我得到了 sizes = [1958, 2196, 3]。 None 这对我来说很有意义。 lines 也有 depth = 5type = 13.

似乎我从错误的矩阵(输入图像而不是 lines)创建了索引器,这就是为什么它如此大并且类型为无符号字节的原因。

lines 矩阵创建索引器得到一个 IntRawIndexer,其中行对应于行数,一列,第三维大小为 4,给出 x1, y1, x2, y2 :

  val indexer: IntRawIndexer = lines.createIndexer()

  for (i <- 0 until indexer.rows().toInt /* lines.rows() */) {
    val x1    = indexer.get(i, 0, 0)
    val y1    = indexer.get(i, 0, 1)
    val x2    = indexer.get(i, 0, 2)
    val y2    = indexer.get(i, 0, 3)

    println(s"x1 = $x1, y1 = $y1, x2 = $x2, y2 = $y2")

    val pt1 = new Point(x1, y1)
    val pt2 = new Point(x2, y2)
    val colr  = new Scalar(0, 0, 255, 128)

    opencv_imgproc.line(mat, pt1, pt2, colr, 1, opencv_core.LINE_AA, 0)
  }