c++图像的加权操作,合成新图片

图像的加权操作,合成新图片

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。最后,我们保存了混合后的图像。

通过调整 alphabeta 的值,可以控制两幅图像在混合过程中的权重,从而实现不同程度的图像混合效果。
c++图像的加权操作,合成新图片_第1张图片

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;
}

c++图像的加权操作,合成新图片_第2张图片

你可能感兴趣的:(c++,opencv,开发语言)