我正在尝试使用带有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)
...
有几个原因导致这个错误对我没有意义:
convertTo(...32FC1)
。打印image.channels()
显示有3个频道。咦?imageInFloats
的大小是image.channels()
的倍数。我认为这与错误消息相矛盾,因为它不是频道数量的倍数。 为什么此代码会抛出should be a multiple of Mat channels count
错误?
配置详情:
最后的说明:
有一个更轻量级的Scala库,可以像OpenCV一样将图像加载到Scala中。我正在使用OpenCV,因为我在Scala中使用OpenCV做了很多其他的视觉事务。也就是说,我愿意为图像I / O探索其他库。
答案 0 :(得分:4)
如果您喜欢:Highgui.imread(imgName)
,则将其加载为3通道rgb图像。
如果您Highgui.imread(imgName,0)
(加载为灰度)或应用cvtColor()进行手动转换,它应该如您所料。