我正在尝试使用带有 Java 绑定的 OpenCV 在 Scala 中加载图像。加载图像后,我想将其转换为传统的 Scala Array[Float]
。
按照这篇文章中的建议,我实现了以下代码来实现这一点:
val image = Highgui.imread(imgName)
image.convertTo(image, CvType.CV_32FC1) //convert 8-bit char -> single channel 32-bit float
val s = image.size()
val height = s.height.asInstanceOf[Int]
val width = s.width.asInstanceOf[Int]
val nChannels = image.channels()
printf("img size = %d, %d, %d \n", height, width, nChannels); // 512, 512, 3
//thanks: http://answers.opencv.org/question/4761/mat-to-byte-array/
val imageInFloats = new Array[Float](height * width * image.channels())
image.get(0, 0, imageInFloats)
编译代码时,我收到以下错误:
[error] (run-main) java.lang.UnsupportedOperationException:
Provided data element number (1) should be multiple of the Mat channels count (3)
java.lang.UnsupportedOperationException: Provided data element number (1) should
be multiple of the Mat channels count (3)
at org.opencv.core.Mat.get(Mat.java:2587)
at HelloOpenCV$.main(conv.scala:25)
...
这个错误对我来说没有意义有几个原因:
- 图像应该是 1 通道,因为我们这样做
convertTo(...32FC1)
。打印image.channels()
显示有 3 个通道。嗯? - 的大小
imageInFloats
是 的倍数image.channels()
。我认为这与关于它不是通道数量的倍数的错误消息相矛盾。
为什么这段代码会抛出should be a multiple of Mat channels count
错误?
配置细节:
- sbt 0.12.4
- OpenCV 2.4.9
最后注意事项:
有一个更轻量级的 Scala 库,可以和 OpenCV 一样将图像加载到 Scala 中。我正在为此使用 OpenCV,因为我一直在使用 OpenCV 在 Scala 中做很多其他的视觉工作。也就是说,我愿意探索其他用于图像 I/O 的库。