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

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

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)是320×240 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) 

奇怪的是,用Java编写的这个代码与旧的Camera API一起工作。 但我不认为这是事业。

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

在这个问题上花了几天后,我发现了一个解决方法。 不幸的是,我不能说为什么上面发布的版本没有工作。

即使在创建相同大小和types的目标图像之后,核心拒绝繁殖。

 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) } 

它的工作! 这段代码看起来更加优雅,因为它立即返回值,而不是模拟一个局部variables