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

news/2024/7/24 13:07:56 标签: c++, opencv, 开发语言

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

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 <opencv2/opencv.hpp>

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 的值,可以控制两幅图像在混合过程中的权重,从而实现不同程度的图像混合效果。
在这里插入图片描述

createTrackbar()函数是OpenCV库的一部分,通常在C++中用于创建一个图形用户界面 (GUI) 元素,允许用户通过拖动滑块来交互地调整参数。以下是在C++中使用createTrackbar()的基本示例:

#include <opencv2/opencv.hpp>

// 创建一个回调函数,在滑块值改变时被调用
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 <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
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;
}

在这里插入图片描述


http://www.niftyadmin.cn/n/5055740.html

相关文章

什么是推挽电路?

推挽电路原理&#xff1a; 可以简单理解为推和拉&#xff1b; 此电路总共用到两个元器件&#xff0c;对应图中的Q1----NPN三极管&#xff0c;Q2----PNP三极管&#xff0c;两个电阻R1和R2起到限流的作用&#xff1b;两个三极管的中间对应信号的输出。 下面就举例说明是如何工作的…

iCloud邮箱怎么登录?看这里,2招教你搞定!

iCloud邮箱是苹果公司推出的一款功能强大的邮件服务。通过iCloud邮箱&#xff0c;用户可以实现接收和发送电子邮件。苹果强调保护用户的隐私和数据安全&#xff0c;所以icloud邮箱为用户提供了高度保密的邮件加密服务&#xff0c;能够确保用户的邮件在传输时得到保护。 但是&a…

nginx 记录每个IP连接的流量大小多少KB

要记录每个IP连接的流量多少&#xff0c;可以使用Nginx的ngx_http_limit_conn_module模块结合access_log指令来实现。 首先&#xff0c;确保您的Nginx已经编译安装了ngx_http_limit_conn_module模块。然后&#xff0c;按照以下步骤进行配置&#xff1a; 在http块中&#xff0…

京东数据平台:2023年8月京东白酒行业品牌销售排行榜

鲸参谋监测的京东平台8月份白酒市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年8月份&#xff0c;白酒市场的销量为198万&#xff0c;环比下滑约6%&#xff0c;同比下滑不足1%&#xff1b;销售额为15亿&#xff0c;环比下滑约18%&#xff0c;同比则…

linux多线程例程

linux多线程例程 linux下多线程例子 #include <stdio.h> #include <stdlib.h> #include <pthread.h> // 定义互斥锁 pthread_mutex_t mutex; // 线程函数 void *thread_func(void *arg) { // 加锁 pthread_mutex_lock(&mutex); // 访问共享…

博主老程序员长期个人接单

主要技术栈 &#xff1a; 后端: .net winform webapi 前端&#xff1a;vue2 vue3 微信小程序 数据库&#xff1a; sqlserver mysql 小程序案例&#xff1a;快猪小寓微信小程序客户端 后台管理系统 联系微信 或 QQ 35568701

uvm白皮书练习_ch2_ch224_加入virtual interface

记录 参考使用uvm白皮书内容 从根本上来说&#xff0c;应该杜绝在验证平台中使用绝对路径 避免绝对路径一个方法是使用宏 define TOP top_tb define TOP top_tb task my_driver::main_phase(uvm_phase phase);phase.raise_objection(this);uvm_info("my_driver"…

计算机网络第五节 网络层

一&#xff0c;网络引入的目的 1.网络层以下层次解决的问题&#xff0c;未解决的问题 从7层结构上看&#xff0c;网络层下是数据链路层 从4层结构上看&#xff0c;网络层下面是网络接口层 至少我们看到的网络层下面是以太网 以太网解决了什么问题&#xff1f; 答&#xff1…