使用Java将Mat复制到OpenCV中的原始数组? (获得“多个通道计数”错误)

时间:2013-08-03 00:33:06

标签: java scala opencv image-processing

我正在尝试使用带有Java绑定的OpenCV在Scala中加载图像。加载图片后,我想将其转换为传统的Scala Array[Float]

根据this post中的建议,我实现了以下代码来实现此目的:

    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,因为我在Scala中使用OpenCV做了很多其他的视觉事务。也就是说,我愿意为图像I / O探索其他库。

1 个答案:

答案 0 :(得分:4)

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

如果您Highgui.imread(imgName,0)(加载为灰度)或应用cvtColor()进行手动转换,它应该如您所料。