滑动条 Trackbar[OpenCV 笔记9]
OpenCV中没有实现按钮的功能,我们可以利用滑动条来实现按钮功能。
int createTrackerbar(const string& trackerbarname, const string winame, int* value, int count,
TrackbarCallback onChange=0, void* userdata=0);
trackbarname
轨迹条的名字。
winname
窗口的名字,轨迹条会依附在这个窗口上。
value
一个指向整型的指针,表示滑块的位置,在创建时,滑块的初始位置就是该变量当前的值。
count
滑块可以达到的最大位置的值。滑块最小位置的值始终为0。
onchange
指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int,void*);其中第一个参数是轨迹条的位置,第二个参数是用户数据(本函数中参数userdata)。如果回调函数是NULL指针,则表示没有回调函数的调用,仅参数value有变化。
userdata
用户传给回调函数的数据,用来处理轨迹条事件。如果使用的value实参是全局变量,可以不去管userdata参数。
int getTrackbarPos(const string& trackbarname, const string& winname );
trackbarname
轨迹条的名字
winname
轨迹条的父窗口的名称
实例
下面的代码将wuli男神和wuli女神的图片混合在一起,输入图片如下:
wuliEddie1.jpg
wuliShishi.jpg
MixAlphaImages.cxx
#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #define WINDOW_NAME "Mixed Images" // global variables const int g_nMaxAlphaValue = 100; // maximun alpha value int g_nAlphaValueSlider; // value from trackbar double g_dAlphaValue; double g_dBetaValue; // Mat objects for images cv::Mat g_srcImage1; cv::Mat g_srcImage2; cv::Mat g_dstImage; // on trackbar void on_Trackbar( int, void* ) { g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue; g_dBetaValue = (1.0-g_dAlphaValue); addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage); cv::imshow(WINDOW_NAME, g_dstImage); } // main int main( int argc, char** argv ) { // load image and show g_srcImage1 = cv::imread("wuliEddie1.jpg"); g_srcImage2 = cv::imread("wuliShishi1.jpg"); // NOTE: two image should be the same size if(!g_srcImage1.data) { printf("Error getting the first images. Put the image wuliEddie1.jpeg to Debug folder. \n"); return -1; } if(!g_srcImage1.data) { printf("Error getting the second images. Put the image wuliShishi1.jpeg to Debug folder. \n"); return -1; } // initialize trackbar value g_nAlphaValueSlider = 70; // create window cv::namedWindow(WINDOW_NAME, 1); // create trackbar char TrackbarName[50]; sprintf( TrackbarName, "Alpha Value %d", g_nMaxAlphaValue ); cv::createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar ); // to show the initial image on_Trackbar(g_nAlphaValueSlider, 0); cv::waitKey(0); return 0; }
结果图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通