opencv自带例子学习-图像混合

栏目: 编程工具 · 发布时间: 7年前

内容简介:拿到校招offer后,离毕业还有近一年的时间。趁这段时间就好好复习巩固一下opencv及图像处理的知识,网上不少opencv教程,浅显易懂的有毛星云大大的《学习OpenCV3》。比较系统的有经典的国外教材《Learning OpenCV》。但是其实我们都忽略还有一个重要同时非常好的学习资源,就是官方自带的samples,我觉得好好阅读学习一边这些例子是很有帮助的。cpp的例子数量还是可观的,相信对于人一个没有基础的学习完,进步也是很大的。

拿到校招offer后,离毕业还有近一年的时间。趁这段时间就好好复习巩固一下opencv及图像处理的知识,网上不少opencv教程,浅显易懂的有毛星云大大的《学习OpenCV3》。比较系统的有经典的国外教材《Learning OpenCV》。但是其实我们都忽略还有一个重要同时非常好的学习资源,就是官方自带的samples,我觉得好好阅读学习一边这些例子是很有帮助的。

自带例子在解压包中

opencv自带例子学习-图像混合

opencv自带例子学习-图像混合 opencv自带例子学习-图像混合

自带例子非常丰富,包含多方面的。热门的Android,c++和 java 都有。笔者主用c++,目前先学习cpp部分。

opencv自带例子学习-图像混合 opencv自带例子学习-图像混合

cpp的例子数量还是可观的,相信对于人一个没有基础的学习完,进步也是很大的。

好了废话不多说,先上第一个demo。图像混合的的例子先直接上代码。

//两张图片的混合公式
//dst = alpha*src1 + beta*src2
//dst = alpha*src1 + beta*src2 + gamma(可选)

 //包含所需的头文件
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

using namespace cv;

//不建议使用 using namespace std;避免引起命名空间污染。同样的不建议使用 using namespace cv, 应当使用cv::的形式
using std::cin;
using std::cout;
using std::endl;


int main( void )
{
    //定义和初始化alpha、beta
   double alpha = 0.5; double beta; double input;

    //定义所需图像mat容器
   Mat src1, src2, dst;


   //提示用户输入alpha的值
   cout << " Simple Linear Blender " << endl;
   cout << "-----------------------" << endl;
   cout << "* Enter alpha [0.0-1.0]: ";
   cin >> input;

   // 输入的alpha的值必须在[0, 1]区间,否则使用默认值
   if( input >= 0 && input <= 1 )
     { alpha = input; }

   //加载需要混合的两张图片,要求两张图片必须大小和类型一致
   src1 = imread( "../data/LinuxLogo.jpg" );
   src2 = imread( "../data/WindowsLogo.jpg" );

  //检查两张图片是否加载成功
   if( src1.empty() ) { cout << "Error loading src1" << endl; return -1; }
   if( src2.empty() ) { cout << "Error loading src2" << endl; return -1; }

  
   beta = ( 1.0 - alpha );//计算beta, beta和alpha相加为1
   addWeighted( src1, alpha, src2, beta, 0.0, dst);//图片混合


   
   imshow( "Linear Blend", dst );//显示混合后的图片
   waitKey(0);//等待按下任意键结束
  
   return 0;
}

小结

整个程序还是比较简单,把流程总结一大概是这样的。

  • 定义和初始化所需要的变量和图像容器。
  • 提示用户输入变量值
  • 检查用户输入变量值
  • 加载两张相同大小和类型的图片
  • 检查图片是否加载成功
  • 调用addWeighted函数执行混合操作
  • 显示混合结果

整个程序其实重点就是围绕图像混合公式

dst = alpha*src1 + beta*src2
dst = alpha*src1 + beta*src2 + gamma(可选)

来实现。而addWeighted函数就是混合公式的代码实现。那么来看一下混合公式,

其实就是一个线性混合

dst = alpha*src1 + (1 - alpha)*src2 + gamma//gamma可选

即对每一个像素点执行上诉公式的操作。

然后看一下addWeighted函数原型

void cv::addWeighted ( InputArray  src1, 
  double  alpha, 
  InputArray  src2, 
  double  beta, 
  double  gamma, 
  OutputArray  dst, 
  int  dtype = -1  
 )

附上参数的解释

opencv自带例子学习-图像混合


以上所述就是小编给大家介绍的《opencv自带例子学习-图像混合》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图解服务器端网络架构

图解服务器端网络架构

[日] 宫田宽士 / 曾薇薇 / 人民邮电出版社 / 2015-4 / 79.00元

本书以图配文,详细说明了服务器端网络架构的基础技术和设计要点。基础设计是服务器端网络架构最重要的一个阶段。本书就立足于基础设计的设计细分项目,详细介绍各细分项目的相关技术和设计要点。全书共分为5章,分别讲述进行物理设计、逻辑设计、安全设计和负载均衡设计、高可用性设计以及管理设计时所必需的技术和设计要点。一起来看看 《图解服务器端网络架构》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具