在JavaCV中合并两个Mat
OpenCV有各种图象处理函数,象彩色空间转换,均值模糊、中值模糊、高斯模糊、双边模糊,二值化,反射投影,模板匹配等。但OpenCV的绘图能力实在不强,中文支持也不好。为了将一个Mat添加到另一个Mat,也会发生许多奇怪的事情。
Mat类有两个方法函数,象是能完成这项工作,它们是:put和copyTo,但在这两个函数中没有提供坐标来确定添加的位置,并且效果也不同。
使用子Mat的方式来确定添加位置
子Mat是我的叫法,英文原文翻译应该叫子矩阵,不过我感觉子Mat更好理解些。在一个Mat中定义子Mat的代码如下:
Mat cmat = mat.apply(new Rect(10,10,100,100));
如上,cmat就是mat的子Mat,这时更改cmat上的象素,Mat也会改变。用上面的原理,只需要将要添加合并的Mat添加到cmat中,就可以了,也确定了位置。
Mat.put的使用
在javaCV中,put有多种实现,我只试用了两种:Mat.put(Scalar s)和Mat.put(Mat m)。但只有Mat.put(Scalar s)成功更改了父Mat,而Mat.put(Mat m)并没有更改父Mat中的内容,分析原因可能是运行Mat.put(Mat m)时,原子Mat已不再是子Mat了,而成了一个独立的Mat。
Mat.copyTo的使用
这个可以正常运行,达到我们的目的
Rect rect = new Rect(100, 100, tmp.cols(), tmp.rows()); //将数据复制到子矩阵 // copyTo 可以正常工作 tmp.copyTo(mat.apply(rect));
结论
经过上面的尝试,若要合并两个Mat,过程应该是:定义拷贝区域、应用子Mat、拷贝数据