Han Xu's blogs
  • 🥳欢迎!
  • Linux
    • 【Linux_install】详细的Ubuntu和win双系统安装指南
    • 【Linux】分区向左扩容的方法
    • 【Linux】挂载硬盘并设置开机自动挂载
    • 【Linux】grub命令行引导进入windows系统
    • 【Linux】python版本控制和环境管理
    • 【Linux】安装n卡驱动,美化gnome
    • 【Linux】gnome桌面环境切换KDE Plasma
  • python
    • 【matplotlib教程】数据可视化
    • 【python】实战:大批量数据的处理和拟合
    • 【Python爬虫】批量爬取图片的简单案例
    • 【scikit-opt】七大启发式算法的使用
    • 【综合评价方法】常见综合评价方法及其实现
    • 【python教程】打包和发布自己的项目,让别人去pip
    • 【PyTorch】n卡驱动、CUDA Toolkit、cuDNN全解安装教程
    • 【Pytorch教程】迅速入门Pytorch深度学习框架
    • 【稀疏矩阵】使用torch.sparse模块
  • C_C++
    • 【CMake】掌握CMake基本操作
    • 【计算机二级C++】题目与C++知识自检
  • matlab
    • 【Matlab】基础教程
  • 🤖ROS
    • 【ROS教程】安装ROS全流程及可能遇到的问题
    • 【ROS教程】用CLion编译和调试ROS包的全流程及可能遇到的问题
    • 【ROS教程】ROS文件系统和基础架构
    • 【ROS教程】ROS常用命令
    • 【ROS教程】话题通信
    • 【ROS教程】服务通信
    • 【ROS教程】ROS常用API讲解
    • 【ROS教程】编写launch文件
  • 📷Computer_Vision
    • Novel_View_Synthesis
      • 【NeRF】由浅入深介绍Neural_Radiance_Fields
      • 【CameraPoseRefinement】以BARF为例介绍三维重建中的位姿优化
      • 【3DGS】从新视角合成到3D_Gaussian_Splatting
      • 【NeRF】截至2024.12NeRF系列工作总结
    • SLAM
      • 【Survey】截至2024.12SLAM系列工作总结
    • OpenCV
      • 【OpenCV教程合集】一文入门和精通OpenCV(C_C++)
      • 【OpenCV教程】OpenCV中的数据类型
      • 【OpenCV教程】OpenCV中对矩阵的常用操作
      • 【OpenCV教程】对图像的各种常用操作
      • 【OpenCV教程】滤波和边缘检测的过程
      • 【OpenCV教程】如何优雅地画出一个几何图形
      • 【OpenCV教程】Trackbar到底怎么用?
      • 【OpenCV教程】轮廓检测过程
      • 【OpenCV教程】特征工程
  • 🗑️uncategorized
    • 【LaTex、markdown】常用语法写出漂亮的blog
    • 【git教程】快速掌握git
    • 【Internet Protocol】ip介绍,如何组局域网实现远程桌面和文件共享
    • 《周易》:大衍筮法
    • 【PyCharm】解决虚拟环境pip无法使用问题
    • 【git】解决能访问github但克隆不了的问题
    • 【Windows终端美化】为什么你的终端千篇一律?
Powered by GitBook
On this page
  • 1.createTrackbar创建滚动条
  • 1.1 API
  • 2.getTrackbarPos获得滚动条当前的值
  • 3.使用方式一(recommended)
  • 3.1 原理
  • 3.2 效果
  • 4.使用方式二
  • 4.1 原理
  • 4.2 效果

Was this helpful?

  1. Computer_Vision
  2. OpenCV

【OpenCV教程】Trackbar到底怎么用?

Previous【OpenCV教程】如何优雅地画出一个几何图形Next【OpenCV教程】轮廓检测过程

Last updated 9 months ago

Was this helpful?

@


1.createTrackbar创建滚动条

1.1 API

CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);
  • 参数如下

参数
含义

trackbarname

滚动条名字

winname(window name)

窗体名字。要先用nameWindow创建好同名窗体,滚动条才会出现

value

欲控制的变量的地址

count

欲控制的变量的最大值(最小为0)

onChange

回调函数,默认为空。如果想要传入,那么其参数是固定的

userdata

万能指针,默认为空。如果想要传入,通常用一个类的对象的地址。作为可使用的数据库,用来给回调函数提供变量支持

void onChange(int,void*);

2.getTrackbarPos获得滚动条当前的值

CV_EXPORTS_W int getTrackbarPos(const String& trackbarname, const String& winname);
  • 参数如下

参数
含义

trackbarname

滚动条名字

winname(window name)

窗体名字

3.使用方式一(recommended)

3.1 原理

不使用createTrackbar函数的参数value、onChange、userdata参数。通过while(1)的无限循环,在循环中不断地用getTrackbarPos函数动态地获取滚动条的值,然后在循环内部用这些值进行操作。

3.2 效果

Mat xuenai = imread("xuenai.jpg");
imshow("xuenai",xuenai);

namedWindow("xuenai_rotate");
Mat xuenai_rotate(xuenai.size(), xuenai.type());
createTrackbar("angle","xuenai_rotate", nullptr,360);
while (1) {
    int angle= getTrackbarPos("angle","xuenai_rotate");
    Mat M = getRotationMatrix2D(Point2f(xuenai.cols / 2, xuenai.rows / 2), angle, 1);
    warpAffine(xuenai, xuenai_rotate, M, xuenai.size());
    imshow("xuenai_rotate",xuenai_rotate);
    waitKey(20);
}

4.使用方式二

4.1 原理

不使用getTrackbarPos函数,使用createTrackbar的全部参数,在onChange回调函数中完成所有操作,由于回调函数的参数表是固定的,因此**需要userdata传入所需数据。**在每次移动滚动条时,相当于调用了一次回调函数,就完成了操作。结尾没有waitKey(0)就显示不了多久。

4.2 效果

class TrackbarUserdata{
public:
    Mat input;
    Mat output;
    int angle=0;
    string winname;
};

void RotateonChange(int,void *userdata) {

    TrackbarUserdata *data = (TrackbarUserdata *) userdata;
    int rows = data->input.rows;
    int cols = data->output.cols;
    Mat M = getRotationMatrix2D(Point2f(rows / 2, cols / 2), data->angle, 1);
    warpAffine(data->input,data->output,M,data->input.size());
    imshow(data->winname,data->output);
    waitKey(10);

}
int main(){
    Mat xuenai = imread("xuenai.jpg");
    imshow("xuenai",xuenai);

    Mat xuenai_rotate(xuenai.size(), xuenai.type());
  
    TrackbarUserdata userdata;
    userdata.input=xuenai;
    userdata.output=xuenai_rotate;
    userdata.winname="xuenai_rotate";
    namedWindow(userdata.winname);
    createTrackbar("angle",userdata.winname, &userdata.angle,360, RotateonChange,&userdata);
    waitKey();
  
    return 0;
}
📷
TOC