Kurento自定义OpenCV模块开发方法总结(四)
标签:kurentoopencv |
分类:IT那点事儿说起来却也又臭又长 |
在前面的三篇博文中,我们介绍了Kurento中OpenCV类型模块的开发方法,本篇会分享本博主在开发OpenCV模块中遇到的一个关于图片通道的问题以及解决方法。首先来说明下这个问题是如何遇到的,在最近的项目开发中从事计算机视觉处理的同事写了一个类似于虚拟现实的工具库,在将该工具库接入到Kurento的OpenCV模块时,发现处理后的图像(如下图所示)不仅没有出现想要的效果,反而变得根本没法供人类看了。
后来到Kurento的Google论坛上问了问才恍然大悟:通过kurento-module-scaffold.sh工具创建的OpenCV模块(包括Gstreamer模块)均使用4通道RGBA图片,而我们的图像处理算法默认输入图片都是3通道的,所以在处理之前需要做一些必要的转换处理!以下代码给出了解决该问题的正确姿势,供遇到相同的看客们参考。
void AugmentedRealityFilterOpenCVImpl::process (cv::Mat&mat)
{
// 创建一个新3通道Mat结构
cv::Mat newMat(480,640, CV_8UC3);
//将4通道Mat数据拷贝到3通道Mat结构
mat.copyTo(newMat);
//通过cvtColor函数完成BGRA2BGR转换
cvtColor(newMat,newMat, CV_BGRA2BGR);
//对3通道Mat结构进行图像处理
DoSomething(newMat);
//通过cvtColor对3通道Mat结构进行BGR2BGRA转换
cvtColor(newMat,newMat, CV_BGR2BGRA);
//将3通道Mat数据拷贝回4通道Mat结构
newMat.copyTo(mat);
}
在调试过程中我们还发现另外一个有趣的问题,即传递给process函数的mat参数貌似是一个全局的对象引用,因为如果对mat直接调用cvtColor进行通道转换变为3通道的话,那么下一次process被调用时传递进来的mat已经默认变成了3通道。因此,不希望对mat本身的属性进行任何修改的话,最好还是像上面的代码一样,拷贝出一个新的cv::Mat结构进行操作。