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