从头开始opencv(六)——core:Adding two images

从头开始opencv(六)——core:Adding two images


Goal

  • what is linear blending and why it is useful;[什么是线性混合,以及它为什么有用]
  • how to add two images using addWrighted()

Theory

g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( x ) g(x)=(1-\alpha)f_0(x)+\alpha f_1(x) g(x)=(1α)f0(x)+αf1(x)

测试图片:

test.jpgtest1.jpg
在这里插入图片描述在这里插入图片描述
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(void)
{
    double alpha = 0.5; double beta; double input;
    Mat src1, src2, dst;
    cout << " Simple Linear Blender " << endl;
    cout << "-----------------------" << endl;
    cout << "* Enter alpha [0.0-1.0]: ";
    cin >> input;
    // We use the alpha provided by the user if it is between 0 and 1
    if (input >= 0 && input <= 1)
    {
        alpha = input;
    }
    src1 = imread("D:/0PKU/opencv/test.jpg");
    src2 = imread("D:/0PKU/opencv/test1.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);
    addWeighted(src1, alpha, src2, beta, 0.0, dst);
    imshow("Linear Blend", dst);
    waitKey(0);
    return 0;
}

【注】:所用来做效果的两幅图片必须尺寸大小一致,不然运行会发生错误。
在这里插入图片描述
  当尺寸大小一致时,就可以正常运行了。

test2.pngtest3.png
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

addWeighted()源码

  在"D:\software\opencv\opencv\sources\modules\core\src\arithm.cpp"中找到的源代码。

namespace cv
{

static BinaryFuncC* getAddWeightedTab()
{
    static BinaryFuncC addWeightedTab[] =
    {
        (BinaryFuncC)GET_OPTIMIZED(cv::hal::addWeighted8u), (BinaryFuncC)GET_OPTIMIZED(cv::hal::addWeighted8s), (BinaryFuncC)GET_OPTIMIZED(cv::hal::addWeighted16u),
        (BinaryFuncC)GET_OPTIMIZED(cv::hal::addWeighted16s), (BinaryFuncC)GET_OPTIMIZED(cv::hal::addWeighted32s), (BinaryFuncC)cv::hal::addWeighted32f,
        (BinaryFuncC)cv::hal::addWeighted64f, 0
    };

    return addWeightedTab;
}

}

void cv::addWeighted( InputArray src1, double alpha, InputArray src2,
                      double beta, double gamma, OutputArray dst, int dtype )
{
    CV_INSTRUMENT_REGION()

    double scalars[] = {alpha, beta, gamma};
    arithm_op(src1, src2, dst, noArray(), dtype, getAddWeightedTab(), true, scalars, OCL_OP_ADDW);
}

  是我看不懂的代码了。。。感觉像是直接调用了其他的库。【如果有大佬懂,可以私信我吗,感激不尽!】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值