当前位置: 首页 > ds >正文

Qt去噪面板搭建

建立单选互斥性面板用于选择噪声属性

// 创建去噪面板
QWidget* noisePanel = new QWidget();
QVBoxLayout* mainLayout = new QVBoxLayout(noisePanel);
mainLayout->setContentsMargins(10, 10, 10, 10);
mainLayout->setSpacing(15);

  // 去噪方法选择组
QGroupBox* methodGroup = new QGroupBox("去噪方法", noisePanel);
QHBoxLayout* methodLayout = new QHBoxLayout(methodGroup);
methodLayout->setContentsMargins(10, 10, 10, 10);
methodLayout->setSpacing(10);

QGroupBox用于将相关的控件组织在一起,形成一个具有标题的分组

    // 使用QButtonGroup管理互斥性
QButtonGroup* blurMethodGroup = new QButtonGroup(methodGroup) 

QButtonGroup 是 Qt 框架中用于管理一组按钮的类,它本身不是可视化控件,而是提供逻辑分组功能,主要用于实现互斥选择(如单选按钮组)

    QRadioButton* gaussianBlurBtn = new QRadioButton("高斯", methodGroup);
QRadioButton* medianBlurBtn = new QRadioButton("中值", methodGroup);
QRadioButton* bilateralBlurBtn = new QRadioButton("双边", methodGroup);
QRadioButton* meanBlurBtn = new QRadioButton("均值", methodGroup);
// 添加到按钮组
blurMethodGroup->addButton(gaussianBlurBtn, 0);
blurMethodGroup->addButton(medianBlurBtn, 1);
blurMethodGroup->addButton(bilateralBlurBtn, 2);
blurMethodGroup->addButton(meanBlurBtn, 3);

// 默认选中高斯模糊
gaussianBlurBtn->setChecked(true);

    // 添加到布局
methodLayout->addWidget(methodLabel);
methodLayout->addWidget(gaussianBlurBtn);
methodLayout->addWidget(medianBlurBtn);
methodLayout->addWidget(bilateralBlurBtn);
methodLayout->addWidget(meanBlurBtn);
methodLayout->addStretch();
mainLayout->addWidget(methodGroup);
mainLayout->addStretch();

看一下效果

参数调节区域的设置

// 参数调节区域
QGroupBox* parameterGroup = new QGroupBox("参数调节", noisePanel);
QGridLayout* parameterLayout = new QGridLayout(parameterGroup);
parameterLayout->setContentsMargins(10, 10, 10, 10);
parameterLayout->setSpacing(10);


// 窗口大小设置
QLabel* windowSizeLabel = new QLabel("窗口大小:", parameterGroup);
QSpinBox* windowSizeSpinBox = new QSpinBox(parameterGroup);
windowSizeSpinBox->setRange(1, 31);           // 限制合理范围
windowSizeSpinBox->setSingleStep(2);         // 步长为2确保奇数
windowSizeSpinBox->setValue(1);              // 默认值
windowSizeSpinBox->setToolTip("窗口大小必须为奇数");
windowSizeSpinBox->setFixedWidth(80);

 //颜色设置
QLabel* colorLabel = new QLabel("颜色:", parameterGroup);
colorSigmaSpinBox = new QSpinBox(parameterGroup);
colorSigmaSpinBox->setRange(1, 100);
colorSigmaSpinBox->setValue(10);              // 默认值
colorSigmaSpinBox->setFixedWidth(80);

 //空间设置
QLabel* spaceLabel = new QLabel("空间:", parameterGroup);
spaceSigmaSpinBox = new QSpinBox(parameterGroup);
spaceSigmaSpinBox->setRange(1, 100);
spaceSigmaSpinBox->setValue(10);            // 默认值
spaceSigmaSpinBox->setFixedWidth(80);
//保存设置
QWidget* save = new QWidget(noisePanel);
QHBoxLayout* saveLayout = new QHBoxLayout(save);
saveLayout->addStretch();
Blursave = new QPushButton("保存配置", save);
Blursave->setFixedWidth(80);
saveLayout->addWidget(Blursave);


// 添加到布局
methodLayout->addWidget(methodLabel);
methodLayout->addWidget(gaussianBlurBtn);
methodLayout->addWidget(medianBlurBtn);
methodLayout->addWidget(bilateralBlurBtn);
methodLayout->addWidget(meanBlurBtn);
methodLayout->addStretch();
mainLayout->addWidget(methodGroup);
parameterLayout->addWidget(windowSizeLabel, 0, 0);
parameterLayout->addWidget(windowSizeSpinBox, 0, 1);
parameterLayout->addWidget(colorLabel, 0, 2);
parameterLayout->addWidget(colorSigmaSpinBox, 0, 3);
parameterLayout->addWidget(spaceLabel, 0, 4);
parameterLayout->addWidget(spaceSigmaSpinBox, 0, 5);
mainLayout->addWidget(parameterGroup);
mainLayout->addWidget(save);
mainLayout->addStretch();

 functionStack->addWidget(noisePanel);

看一下效果

下一目标调整选择逻辑

当选择相对应的去噪方法时,做对应的屏蔽处理

void OpenCVModule::setupImageNoisePanel() {
// 创建去噪面板
QWidget* noisePanel = new QWidget();
QVBoxLayout* mainLayout = new QVBoxLayout(noisePanel);
mainLayout->setContentsMargins(10, 10, 10, 10);
mainLayout->setSpacing(15);

    // 去噪方法选择组
QGroupBox* methodGroup = new QGroupBox("去噪方法", noisePanel);
QHBoxLayout* methodLayout = new QHBoxLayout(methodGroup);
methodLayout->setContentsMargins(10, 10, 10, 10);
methodLayout->setSpacing(10);

    // 创建方法选择标签和按钮
QLabel* methodLabel = new QLabel("噪声方法选择:", methodGroup);

    // 使用QButtonGroup管理互斥性
QButtonGroup* blurMethodGroup = new QButtonGroup(methodGroup);

    QRadioButton* gaussianBlurBtn = new QRadioButton("高斯", methodGroup);
QRadioButton* medianBlurBtn = new QRadioButton("中值", methodGroup);
QRadioButton* bilateralBlurBtn = new QRadioButton("双边", methodGroup);
QRadioButton* meanBlurBtn = new QRadioButton("均值", methodGroup);
// 添加到按钮组
blurMethodGroup->addButton(gaussianBlurBtn, 0);
blurMethodGroup->addButton(medianBlurBtn, 1);
blurMethodGroup->addButton(bilateralBlurBtn, 2);
blurMethodGroup->addButton(meanBlurBtn, 3);
// 默认选中高斯模糊
gaussianBlurBtn->setChecked(true);

// 参数调节区域
QGroupBox* parameterGroup = new QGroupBox("参数调节", noisePanel);
QGridLayout* parameterLayout = new QGridLayout(parameterGroup);
parameterLayout->setContentsMargins(10, 10, 10, 10);
parameterLayout->setHorizontalSpacing(5);  // <<<<< 减少横向间隙
parameterLayout->setVerticalSpacing(10);   // 保持垂直间隙

    // 窗口大小设置
windowSizeLabel = new QLabel("窗口大小:", parameterGroup);
windowSizeSpinBox = new QSpinBox(parameterGroup);
windowSizeSpinBox->setRange(1, 31);           // 限制合理范围
windowSizeSpinBox->setSingleStep(2);         // 步长为2确保奇数
windowSizeSpinBox->setValue(1);              // 默认值
windowSizeSpinBox->setToolTip("窗口大小必须为奇数");
windowSizeSpinBox->setFixedWidth(80);

    //颜色设置
colorLabel = new QLabel("颜色:", parameterGroup);
colorSigmaSpinBox = new QSpinBox(parameterGroup);
colorSigmaSpinBox->setRange(1, 100);
colorSigmaSpinBox->setValue(10);              // 默认值
colorSigmaSpinBox->setFixedWidth(80);

    //空间设置
spaceLabel = new QLabel("空间:", parameterGroup);
spaceSigmaSpinBox = new QSpinBox(parameterGroup);
spaceSigmaSpinBox->setRange(1, 100);
spaceSigmaSpinBox->setValue(10);            // 默认值
spaceSigmaSpinBox->setFixedWidth(80);
//保存设置
QWidget* save = new QWidget(noisePanel);
QHBoxLayout* saveLayout = new QHBoxLayout(save);
saveLayout->addStretch();
Blursave = new QPushButton("保存配置", save);
Blursave->setFixedWidth(80);
saveLayout->addWidget(Blursave);


// 添加到布局
methodLayout->addWidget(methodLabel);
methodLayout->addWidget(gaussianBlurBtn);
methodLayout->addWidget(medianBlurBtn);
methodLayout->addWidget(bilateralBlurBtn);
methodLayout->addWidget(meanBlurBtn);
methodLayout->addStretch();
mainLayout->addWidget(methodGroup);
parameterLayout->addWidget(windowSizeLabel, 0, 0);
parameterLayout->addWidget(windowSizeSpinBox, 0, 1);
parameterLayout->addWidget(colorLabel, 0, 2);
parameterLayout->addWidget(colorSigmaSpinBox, 0, 3);
parameterLayout->addWidget(spaceLabel, 0, 4);
parameterLayout->addWidget(spaceSigmaSpinBox, 0, 5);
mainLayout->addWidget(parameterGroup);
mainLayout->addWidget(save);
mainLayout->addStretch();

    functionStack->addWidget(noisePanel);
// 手动设置初始参数状态(不触发日志)(不然会报冲突)
colorLabel->setEnabled(false);
colorSigmaSpinBox->setEnabled(false);
spaceLabel->setEnabled(false);
spaceSigmaSpinBox->setEnabled(false);
windowSizeLabel->setEnabled(true);
windowSizeSpinBox->setEnabled(true);
//切换逻辑
connect(blurMethodGroup, &QButtonGroup::idToggled, this, &OpenCVModule::onBlurChanged);

}

void OpenCVModule::updateParameterState(int id) {
// 默认禁用颜色和空间参数
colorLabel->setEnabled(false);
colorSigmaSpinBox->setEnabled(false);
spaceLabel->setEnabled(false);
spaceSigmaSpinBox->setEnabled(false);

    // 窗口大小始终启用
windowSizeLabel->setEnabled(true);
windowSizeSpinBox->setEnabled(true);

    // 根据模糊类型启用相关参数
switch (id) {
case 0: // 高斯模糊
addLog("选择高斯模糊", LogLevel::Info);
break;
case 1: // 中值模糊
addLog("选择中值模糊", LogLevel::Info);
break;
case 2: // 双边模糊
colorLabel->setEnabled(true);
colorSigmaSpinBox->setEnabled(true);
spaceLabel->setEnabled(true);
spaceSigmaSpinBox->setEnabled(true);
addLog("选择双边模糊", LogLevel::Info);
break;
case 3: // 均值迁移
colorLabel->setEnabled(true);
colorSigmaSpinBox->setEnabled(true);
spaceLabel->setEnabled(true);
spaceSigmaSpinBox->setEnabled(true);
addLog("选择均值迁移", LogLevel::Info);
break;
}
}

void OpenCVModule::onBlurChanged(int id, bool checked) {
if (!checked) return;
currentBlurMethodId = id;
updateParameterState(id);
}


之后就是功能的具体实现

http://www.xdnf.cn/news/15114.html

相关文章:

  • Flutter基础(前端教程⑦-Http和卡片)
  • 【EGSR2025】材质+扩散模型+神经网络相关论文整理随笔(二)
  • 图片的拍摄创建日期怎么改?保护好图片信息安全的好方法
  • 李宏毅NLP-9-语音转换
  • 全球发展币GDEV:从中国出发,走向全球的数字发展合作蓝图
  • 本地Qwen中医问诊小程序系统开发
  • kubernetes存储入门
  • Flutter编译安卓应用时遇到的compileDebugJavaWithJavac和compileDebugKotlin版本不匹配的问题
  • 【c++学习记录】状态模式,实现一个登陆功能
  • huggingface笔记:文本生成Text generation
  • WinUI3入门16:Order自定义排序
  • WouoUI-Page移植
  • 一个vue项目的基本构成
  • 实时音视频通过UDP打洞实现P2P优先通信
  • 方法论汇总
  • ACE-Step:AI音乐生成基础模型
  • 【python】 time_str = time_str.strip() 与 time_str = str(time_str).strip() 的区别
  • Mac安装Docker(使用orbstack代替)
  • 云原生详解:构建现代化应用的未来
  • 【Node.js】文本与 pdf 的相互转换
  • eslint扁平化配置
  • 牛市来临之际,如何用期权抢占反弹先机?
  • rabbitMQ读取不到ThreadLocal消息的bug
  • 如何利用机器学习(ML)检测异常登录行为
  • 视频号账号矩阵运营中定制开发开源 AI 智能名片 S2B2C 商城小程序的赋能研究
  • AR 双缝干涉实验亮相:创新科技实验范式,开拓 AR 技术新局​
  • 开源 python 应用 开发(三)python语法介绍
  • Linux操作系统:再谈虚拟地址空间
  • IT 技术领域创作者三周年纪念日
  • 026_类的定义(属性 / 方法 / 构造器)