OpenCV:在Android上的Kotlin中将Mat与Scalar相乘

时间:2018-01-24 16:33:10

标签: android opencv camera kotlin

我正在编写一个Android应用程序,使用Camera API 2.它以突发模式拍摄3张不同曝光值的图片,并将它们与OpenCV(3.0.0)合并。通过合并,我的意思是Mertens算法,它可以在Photo模块中使用。为了将结果保存为设备上的图像,我需要将其与标量相乘。如果我不这样做,那么结果图像就是黑色。

    fun multiply(src: Mat): Mat {
        val scalar = Scalar(255.0,255.0,255.0)
        val dest = Mat()
        Core.multiply(src, scalar, dest)
        return dest
    }

源图像(src)为320x240 CV_32FC3。

但乘法失败:

android-pack/opencv/modules/core/src/arithm.cpp:1987: error: (-209) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function void cv::arithm_op(cv::InputArray, cv::InputArray, cv::OutputArray, cv::InputArray, int, void (**)(const uchar*, size_t, const uchar*, size_t, uchar*, size_t, cv::Size, void*), bool, void*, int)

奇怪的是,用旧的Camera API用Java编写的这段代码可以工作。但我认为这不是原因。

那我在这里做错了什么?我怎样才能更深入地找到原因?

2 个答案:

答案 0 :(得分:0)

在这个问题上花了好几天后,我发现了一个解决方法。不幸的是,我无法真正说出为什么上面发布的版本没有用。

即使在创建相同大小和类型的目标图像后,核心也不会成倍增加。

val dest = Mat(src.size(), src.type())
Core.multiply.(src, scalar, dest) //still raised exception

我研究了核心模块javadoc的更多内容。一句话给了我一个暗示以另一种方式尝试它:

  

还有一个" MatrixExpressions"第一个功能的友好变体。见" Mat.mul"。

所以我改变了我的乘法方法:

fun multiply(src: Mat): Mat {
  val scalar = Scalar(255.0, 255.0, 255.0)
  val filter = Mat(src.size(), src.type(), scalar)
  return src.mul(filter)
}

它有效!这个片段看起来更优雅,因为它会立即返回值,而不是修改局部变量

答案 1 :(得分:0)

这意味着srcdest的大小有所不同。

您需要使用以下内容创建dest

val dest = Mat(src.width, src.height)