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

OpenCV4(C++)—— 创建窗口滑动条来调参

文章目录

  • 创建滑动条 —— createTrackbar


创建滑动条 —— createTrackbar

createTrackbar是OpenCV中的一个函数,用于创建一个可调节的滑动条(Trackbar),以便在图像处理过程中实时调整参数

 int cv::createTrackbar(const String & trackbarname,  // 滑动条的名称,作为字符串传递const String & winname,  // 滑动条的窗口名称,通常是显示图像的窗口名称int * value,  // 指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义int  count,  // 滑动条的最大取值TrackbarCallback onChange = 0,  // 回调函数:每次滑块更改位置时要调用的函数的指针void * userdata = 0  // 传递给回调函数的可选参数)
其中回调函数的定义如下:void onChange(int value, void* userdata)   // void* userdata 参数是可选的{// 滑动条值发生变化时执行的操作}

可以看到,回调函数是可选参数,当默认为0时,则只更新value,要进行的操作在后面定义

例:二值化,选择参数阈值作为滑动条

#include <opencv2/opencv.hpp>
#include<iostream>  
using namespace std;int main()
{cv::Mat image = cv::imread("C:/Users/Opencv/temp/lena.png");if (image.empty()) {cout << "打开图片失败" <<endl;return -1;}cv::namedWindow("img");cv::imshow("img", image);int value = 128;cv::createTrackbar("阈值", "img", &value, 255);while (true){cv::Mat thrseImg;cv::threshold(image, thrseImg, value, 255, cv::THRESH_BINARY);cv::imshow("img", thrseImg);  // 注意:窗口的名字要和之前的一样//cv::imshow("取不同名字时", thrseImg);  char key = cv::waitKey(10);if (key == 27 || key == 'q'){break;}}cv::waitKey(0);cv::destroyAllWindows();return 0;
}

注:上述代码中,如果while循环里imshow展示的窗口名字跟之前不同,则会新开这个窗口作为滑动结果窗口,如下图所示,在原图img中滑动数值,原图不会改变,改变的是另一个窗口。

在这里插入图片描述
使用回调函数,来简化上述代码

#include <opencv2/opencv.hpp>
#include<iostream>  using namespace std;void callback(int value, void*);
cv::Mat image ,thrseImg;   // 定义成全局变量,才能同时在回调函数中调用int main()
{image = cv::imread("C:/Users/jutze/ljw_C++/Opencv/temp/lena.png");if (image.empty()) {cout << "打开图片失败" <<endl;return -1;}cv::namedWindow("img");cv::imshow("img", image);int value = 128;cv::createTrackbar("阈值", "img", &value, 255, callback);cv::waitKey(0);cv::destroyAllWindows();return 0;
}static void callback(int value, void*)
{cv::threshold(image, thrseImg, value, 255, cv::THRESH_BINARY);cv::imshow("img", thrseImg);
}

此外,OpenCV还提供了鼠标响应函数setMouseCallback()和键盘响应函数setKeyboardCallback(),通过在指定窗口进行鼠标点击或键盘按键,来触发回调函数,执行相关操作。但感觉实际使用的场景比较少,以后遇到再说吧。

http://www.lryc.cn/news/190637.html

相关文章:

  • 深度学习基础知识 学习率调度器的用法解析
  • 【JUC系列-12】深入理解PriorityQueue的底层原理和基本使用
  • Paddle安装
  • 配置XP虚拟机和Win 10宿主机互相ping通
  • 【机器学习】sklearn对数据预处理
  • 【智慧燃气】智慧燃气解决方案总体概述--终端层、网络层
  • Tomcat隔离web原理和热加载热部署
  • 使用ffmpeg和python脚本下载网络视频m3u8(全网最全面)
  • 【考研408常用数据结构】C/C++实现代码汇总
  • Flink学习笔记(二):Flink内存模型
  • 信息系统项目管理师第四版学习笔记——项目绩效域
  • PyTorch 深度学习之加载数据集Dataset and DataLoader(七)
  • 小谈设计模式(26)—中介者模式
  • 7种设计模式
  • el-table合计行合并
  • 新手如何快速上手HTTP爬虫IP?
  • (十五)VBA常用基础知识:正则表达式的使用
  • vue配置@路径
  • Ubuntu 18.04 OpenCV3.4.5 + OpenCV3.4.5 Contrib 编译
  • 【网络基础】IP 子网划分(VLSM)
  • 【OCR】合同上批量贴印章
  • Stable diffusion 用DeOldify给黑白照片、视频上色
  • 在服务器上解压.7z文件
  • 【opencv】windows10下opencv4.8.0-cuda C++版本源码编译教程
  • 软碟通制作启动盘
  • Tomcat和HPPT协议
  • Acwing.4736步行者(模拟)
  • 前端预览、下载二进制文件流(png、pdf)
  • 搞定ESD(三):ESD干扰耦合路径深入分析(一)
  • 广州华锐互动:炼钢工厂VR仿真实训系统