当前位置:   article > 正文

OpenCVForUnity(五)图像线性混合_opencv for unity 2.5.6

opencv for unity 2.5.6


前言

图片的融合在日常的图片的处理中算是比较常用的功能,这节课我们一起来学习一下他的工作机制和OpenCV给我们提供的接口。

如下图片我们可以看到两长图片你中有我,我中有你的效果:

在这里插入图片描述


核心理论讲解

其效果我们使用线性混合来实现。
我们知道图片的颜色主是由RGB值来决定的,值的范围是0~255.

当我们要融合两张图片时,则需要按一定比例来分配色值,但是需要注意的是无论怎么分配色值范围都在0~255之间。

那么我则需要一个比例α来控制,首先是α需要在0~1之间。
假设图片A的颜色占比为α时,则另张图片B则需要占比为(1-α) 如此才能确保总和为1.

表达为公式如下(线性混合):
在这里插入图片描述


实现代码讲解:

1、透明度控制

首先是控制对应的透明度
创建alpha和beta用于控制图片占用的比例,并使之总和为1.

float alpha = 0.5f;
float beta = (1.0f - alpha);
  • 1
  • 2

2、加载两张源图像:

使用Imgcodecs方式加载两张需要进行融合的图片。

string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/timg.jpg";
string readPath2 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/lena.jpg";
src1 = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
src2 = Imgcodecs.imread(Utils.getFilePath(readPath2), Imgcodecs.IMREAD_COLOR);
  • 1
  • 2
  • 3
  • 4

注意: 这里需要用到两图张图像,这两个图像的尺寸和类型都要一样.

3、进行融合

核心语句是通过Core.addWeighted方法来进行混合

Core.addWeighted(src1, alpha, src2, beta, 0, dst);
  • 1

参数1:图片源1
参数2::图片源1透明度
参数3:图片源2
参数4:图片源2透明度
参数5:加到标量的和
参数6:混合结果容器

4、色彩模式转换

由于Mat读取图片后储存方式为 BGR,.因而需要转为 RGB
为了节省性能可以选择操作完所有步骤,最后需要显示的时候才转为 RGB模式.

Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGR2RGB);
  • 1

5、装载结果

然后是创建图片装其写入

//创建图片
Texture2D textureA = new Texture2D(dst.cols(), dst.rows(), TextureFormat.RGB24, false);
//将Mat的图片写入Texture2D中
Utils.matToTexture2D(dst, textureA);
  • 1
  • 2
  • 3
  • 4

完整代码:

下面是项目的完整代码:

Mat src1, src2, dst;
float alpha = 0.5f;
float beta = (1.0f - alpha);
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/timg.jpg";
string readPath2 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/lena.jpg";
src1 = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
src2 = Imgcodecs.imread(Utils.getFilePath(readPath2), Imgcodecs.IMREAD_COLOR);
dst = new Mat(src2.size(), Imgcodecs.IMREAD_COLOR);
//混合图片
Core.addWeighted(src1, alpha, src2, beta, 0, dst);
//转写色彩模式
Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGR2RGB);
//创建图片
Texture2D textureA = new Texture2D(dst.cols(), dst.rows(), TextureFormat.RGB24, false);
//将Mat的图片写入Texture2D中
Utils.matToTexture2D(dst, textureA);
//显示出图片
objA.GetComponent<Renderer>().material.mainTexture = textureA;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

结语

这篇教程内容比较简单,大家可以耐心阅读一下,相信会有收获的
看到这了麻烦帮忙点个赞,谢谢。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/98026
推荐阅读
相关标签
  

闽ICP备14008679号