官方文档链接:https://docs.opencv.org/4.2.0/d5/dc4/tutorial_adding_images.html
下面的解释来自 Richard Szeliski 的 《计算机视觉:算法与应用》 一书。从之前的教程中,已经知道了一些像素操作符。下面是一个用于线性混合的双输入算子。
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)
通过将 α 从 0 → 1 变换,这个运算符可用于执行两个图像或视频之间的时间交叉分解,如幻灯片放映和电影制作中所见。
#include
#include
#include
#include
#include
int main(void)
{
double alpha = 0.5; double beta; double input;
cv::Mat src1, src2, dst;
std::cout << " Simple Linear Blender " << std::endl;
std::cout << "--------------------------" << std::endl;
std::cout << "* Enter alpha [0.0-1.0]: ";
std::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 = cv::imread(cv::samples::findFile("label0.png"));
src2 = cv::imread(cv::samples::findFile("label1.png"));
if (src1.empty())
{
std::cout << "Error loading src1" << std::endl;
return EXIT_FAILURE;
}
if (src2.empty())
{
std::cout << "Error loading src2" << std::endl;
return EXIT_FAILURE;
}
beta = 1.0 - alpha;
cv::addWeighted(src1, alpha, src2, beta, 0.0, dst);
cv::imshow("src1", src1);
cv::imshow("src2", src2);
cv::imshow("Linear Blend", dst);
cv::waitKey(0);
return 0;
}
输出图像:
执行混合操作:
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)
需要两个原图像 f0(x) 和 f1(x),所以首先加载图像:
src1 = cv::imread(cv::samples::findFile("label0.png"));
src2 = cv::imread(cv::samples::findFile("label1.png"));
我们使用两幅图像:label0.png 和 label1.png.
由于我们要添加 src1 和 src2,它们必须具有相同的大小(宽度和高度)和类型。
现在需要生成 g(x) 图像,通过调用 cv::addWeighted() 函数实现:
beta = (1.0 - alpha);
cv::addWeighted(src1, alpha, src2, beta, 0.0, dst);
因为 cv::addWeighted() 的产生函数是:
d s t = α ⋅ s r c 1 + β ⋅ s r c 2 + γ dst = \alpha \cdot src1 + \beta \cdot src2 + \gamma dst=α⋅src1+β⋅src2+γ
在本例中,gamma 是上面代码中的参数 0.0 。
创建窗口,显示图像并等待用户结束程序。
cv::imshow("Linear Blend", dst);
cv::waitKey(0);