使 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
;我创建了一个看起来是 UByteRawIndexer
的 Indexer
,我得到了 sizes = [1958, 2196, 3]
。 None 这对我来说很有意义。 lines
也有 depth = 5
和 type = 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)
}
所以,似乎 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
;我创建了一个看起来是 UByteRawIndexer
的 Indexer
,我得到了 sizes = [1958, 2196, 3]
。 None 这对我来说很有意义。 lines
也有 depth = 5
和 type = 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)
}