2

我正在尝试使用带有 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 的库。

4

1 回答 1

4

如果您喜欢 : Highgui.imread(imgName),它会将其加载为 3 通道 rgb 图像。

Highgui.imread(imgName,0)如果您(加载为灰度)或应用 cvtColor() 进行手动转换,它应该可以正常工作。

于 2013-08-03T06:15:45.827 回答