addWeighted
是 OpenCV 库中的一个函数,用于执行两个图像的加权和操作。这个函数可以用来创建一幅新的图像,其中包含了两幅输入图像的加权组合。通常,这在图像融合和混合的应用中非常有用。
下面是 addWeighted
函数的基本语法:
void cv::addWeighted(
cv::InputArray src1, // 第一个输入图像
double alpha, // 第一个输入图像的权重
cv::InputArray src2, // 第二个输入图像
double beta, // 第二个输入图像的权重
double gamma, // 加权和的可选标量
cv::OutputArray dst, // 输出图像
int dtype = -1 // 输出图像的数据类型,默认为-1(与输入相同)
);
参数说明:
src1
:第一个输入图像(可以是 cv::Mat
类型或类似的数据结构)。alpha
:第一个输入图像的权重,一个双精度浮点数。src2
:第二个输入图像。beta
:第二个输入图像的权重,也是一个双精度浮点数。gamma
:加权和的可选标量,通常是一个双精度浮点数。dst
:输出图像,这里将存储加权和的结果。dtype
:输出图像的数据类型,默认为-1,表示与输入图像的数据类型相同。下面是一个使用 addWeighted
函数的示例:
#include
int main() {
// 读取两个输入图像
cv::Mat image1 = cv::imread("image1.jpg");
cv::Mat image2 = cv::imread("image2.jpg");
// 指定权重
double alpha = 0.7;
double beta = 0.3;
double gamma = 0.0;
// 创建一个输出图像
cv::Mat blendedImage;
// 执行加权和操作
cv::addWeighted(image1, alpha, image2, beta, gamma, blendedImage);
// 保存结果图像
cv::imwrite("blended_image.jpg", blendedImage);
return 0;
}
在这个示例中,我们首先读取两个输入图像,然后指定了它们的权重。接着,我们使用 addWeighted
函数将这两个图像进行加权和操作,生成一个混合的输出图像 blendedImage
。最后,我们保存了混合后的图像。
通过调整 alpha
和 beta
的值,可以控制两幅图像在混合过程中的权重,从而实现不同程度的图像混合效果。
createTrackbar()
函数是OpenCV库的一部分,通常在C++中用于创建一个图形用户界面 (GUI) 元素,允许用户通过拖动滑块来交互地调整参数。以下是在C++中使用createTrackbar()
的基本示例:
#include
// 创建一个回调函数,在滑块值改变时被调用
void on_trackbar_change(int value, void* userdata) {
std::cout << "Trackbar value: " << value << std::endl;
}
int main() {
// 创建一个窗口
cv::namedWindow("Trackbar Example");
// 初始化参数值
int initial_value = 0;
int max_value = 100;
// 创建一个滑块
cv::createTrackbar("Trackbar Name", "Trackbar Example", &initial_value, max_value, on_trackbar_change);
while (true) {
// 显示窗口
cv::imshow("Trackbar Example", cv::Mat::zeros(100, 100, CV_8UC1));
// 检查是否按下 'q' 键来退出循环
char key = cv::waitKey(1);
if (key == 'q') {
break;
}
}
// 清理资源
cv::destroyAllWindows();
return 0;
}
在这个示例中,我们首先创建一个窗口,然后使用cv::createTrackbar()
创建在该窗口内的滑块。参数如下:
"Trackbar Name"
: 滑块的名称。"Trackbar Example"
: 滑块将显示在哪个窗口内的名称。&initial_value
: 滑块的初始值的指针。max_value
: 滑块的最大值。on_trackbar_change
: 一个回调函数,每当滑块值发生变化时都会调用。当您在GUI中移动滑块时,on_trackbar_change
函数将被调用,并且滑块的值将在控制台中打印出来。您可以使用这个值来交互地调整图像处理算法中的参数。
记得按下 ‘q’ 键来退出程序当您完成时。
这只是一个基本示例,您可以根据需要修改回调函数和窗口内容进行自定义。
#include
#include
#include
#include
using namespace std;
using namespace cv;
#include
#include
using namespace cv; //包含cv命名空间
#define WINDOW_NAME "【线性混合示例】" //为窗口标题定义的宏
//- ---------------【全局变量声明部分】-------------------------
// 描述: 全局变量声明
//-
const int g_nMaxAlphaValue = 100;//Alpha值的最大值
int g_nAlphaValueSlider;//滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;
//声明存储图像的变量
Mat g_srcImagel;
Mat g_srcImage2;
Mat g_dstImage;
//- ---------------【on_Trackbar()函数】-----------------------
// 描述: 响应滑动条的回调函数
//-
void on_Trackbar(int, void*)
{
//求出当前alpha值相对于最大值的比例
g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue; //则 beta值为1减去 alpha值
g_dBetaValue = (1.0 - g_dAlphaValue);
//根据 alpha和 beta值进行线性混合
addWeighted(g_srcImagel, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
//显示效果图
imshow(WINDOW_NAME, g_dstImage);
}
//---------------------------【main()函数】--------------------------
// 描述: 控制台应用程序的入口函数,我们的程序从这里开始执行
//-
int main(int argc, char** argv)
{
//加载图像 (两图像的尺寸需相同)
g_srcImagel = imread("11.png");
g_srcImage2 = imread("22.png");
if (!g_srcImagel.data) { printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return -1; }
if (!g_srcImage2.data) { printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return -1; }
//设置滑动条初值为70
g_nAlphaValueSlider = 70;
//创建窗体
namedWindow(WINDOW_NAME, 1);
//在创建的窗体中创建一个滑动条控件
char TrackbarName[50];
sprintf_s(TrackbarName, "透明值 %d", g_nMaxAlphaValue);
createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);
//结果在回调函数中显示
on_Trackbar(g_nAlphaValueSlider, 0);
//按任意键退出
waitKey(0);
return 0;
}