我正在使用OpenCv for Java。 我试图以有效的方式对图像执行某些操作,因此使用除法和乘法而不是循环通过行和列。不幸的是,对我的Mat的任何分配都被截断/舍入。我在这里显然错过了一些重要的概念。
示例代码(实际上是Groovy)
Mat mat = getMat(filename)
Mat dst = new Mat(mat.size(), CvType.CV_64FC3)
mat.convertTo(dst, -1)
dst.put(1,1,[180.5,180.5,180.5] as double[])
println "pix:" + dst.get(1,1)
Core.divide(dst, new Scalar(255.0, 255.0, 255.0), dst)
println "divided 255:" + dst.get(1,1)
期望/需要:
pix:[180.5, 180.5, 180.5]
divided 255:[0.7, 0.7, 0.7]
取而代之的是:
pix:[180.0, 180.0, 180.0]
divided 255:[1.0, 1.0, 1.0]
我缺少什么? 是否有可以包含实际浮点数的CvType?
答案 0 :(得分:1)
您应该将mat.convertTo的第二个参数从-1更改为CvType.CV_64FC3。
来自convertTo方法参数的文档:
convertTo(Mat m,int rtype)
m - 目标矩阵。如果在操作之前没有合适的大小或类型,则会重新分配。
rtype - 所需的目标矩阵类型,或者更确切地说,深度,因为通道数与源相同。 如果rtype为负数,则目标矩阵的类型与来源相同。
正如您所看到的,您正在将图像转换为相同的类型。