Kurento自定义OpenCV模块开发方法总结(四)

Kurento自定义OpenCV模块开发方法总结(四)

专注webrtc、kurento音视频开发

qq:911921258

 分类:IT那点事儿说起来却也又臭又长

     在前面的三篇博文中,我们介绍了Kurento中OpenCV类型模块的开发方法,本篇会分享本博主在开发OpenCV模块中遇到的一个关于图片通道的问题以及解决方法。首先来说明下这个问题是如何遇到的,在最近的项目开发中从事计算机视觉处理的同事写了一个类似于虚拟现实的工具库,在将该工具库接入到Kurento的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结构进行操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值