美文网首页OpenCvOpenCV计算机视觉
opencv自带例子学习-图像混合

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

作者: 芒果浩明 | 来源:发表于2018-09-16 20:44 被阅读2次

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

    自带例子在解压包中


    image.png image.png
    image.png

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


    image.png
    image.png

    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  
     ) 
    

    附上参数的解释

    image.png

    相关文章

      网友评论

        本文标题:opencv自带例子学习-图像混合

        本文链接:https://www.haomeiwen.com/subject/bcmfnftx.html