从头开始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.jpg | test1.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.png | test3.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);
}
是我看不懂的代码了。。。感觉像是直接调用了其他的库。【如果有大佬懂,可以私信我吗,感激不尽!】