创建滑动条:
int createTrackbar(const String& trackbarname,
const String& winname,
int* value,
int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
第一个参数, const string&类型的trackbamame, 轨迹条的名字,用来代表我们创建的轨迹条。
第二个参数, const string&类型的winname, 窗口的名字,表示这个轨迹条云依附到哪个窗口上, 即对应namedWindowO创建窗口时填的某一个窗口名。
第三个参数, int * 类型的value, 一个指向整型的指针,表示滑块的位置。在创建时, 滑块的初始位置就是该变量当前的值。
第四个参数, int 类型的count, 表示滑块可以达到的最大位置的值。滑块最小位置的值始终为0 。
第五个参数, TrackbarCallback 类型的onChange, 它有默认值0 。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int, void*);, 其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数) 。如果回调是NULL指针, 则表示没有回调函数的调用,仅第三个参数value 有变化。
第六个参数, void*类型的userdata , 也有默认值0 。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value 实参是全局变量的话,完全可以不去管这个userdata 参数。
一个演示了用轨迹条来控制轮廓检测,轮廓填充的程
/***头文件包含部分***/
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <qstring.h>
#include <qdebug.h>
/***命名空间声明部分***/
using namespace cv;
using namespace std;
/***全局函数声明部分***/
Mat img;
int threshval = 160;//轨迹条滑块对应的值,给初值160
/******************************************************
*on_trackbar()函数
*描述:轨迹条的回调函数
* ****************************************************/
static void on_trackbar(int, void*)
{
Mat bw = threshval < 128 ? (img < threshval) : (img > threshval);
Scalar color;
//定义点和向量
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
//查找轮廓
findContours( bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
//初始化dst
Mat dst = Mat::zeros(img.size(), CV_8UC3);
//开始处理
if( !contours.empty() && !hierarchy.empty() )
{
//遍历所有顶层轮廓,随机生成颜色值绘制给各连接组成部分
int idx = 0;
for( ; idx >= 0; idx = hierarchy[idx][0] )
{
color = Scalar((rand()&255), (rand()&255), (rand()&255));
//绘制填充轮廓
drawContours( dst, contours, idx, color, CV_FILLED, 8, hierarchy );
}
}
qDebug()<<getTrackbarPos("Threshold", "Connected Components");
//显示窗口
imshow( "Connected Components", dst );
}
/******************************************************
*main()函数
*描述:控制台应用程序的入口函数,我们的程序从这里开始
******************************************************/
int main()
{
system("color 5F");
//载入图片
img = imread("D:\\QT\\project\\opencv_qtcreaor\\test\\test\\image.jpg", 0);
if( !img.data ) {
qDebug(("Oh,no,读取img图片文件错误~! \n")); return -1;
}
//显示原图
namedWindow("Image", 1);
imshow( "Image", img );
//创建处理窗口
namedWindow( "Connected Components", 1 );
//创建轨迹条
createTrackbar( "Threshold", "Connected Components", &threshval, 255, on_trackbar );
on_trackbar(threshval, 0);//轨迹条回调函数
waitKey(0);
destroyWindow("Image");
qDebug("aaaaaaaaaaa");
return 0;
}
运行结果:
获取当前轨迹条的位胃:
int getTrackbarPos(const String& trackbarname, const String& winname);
- 第一个参数, const string&类型的trackbamarne, 表示轨迹条的名字。
- 第二个参数, const string&类型的winnarne, 表示轨迹条的父窗口的名称。
鼠标操作
void setMouseCallback(const String& winname,
MouseCallback onMouse,
void* userdata = 0);
- 第一个参数, const string&类型的winname, 窗口的名字。
- 第二个参数, MouseCaJlback 类型的onMouse, 指定窗口里每次鼠标时间发生的时候,被调用的函数指针。
- 第三个参数, void*类型的userdata, 用户定义的传递到回调函数的参数, 有默认值0 。
回调函数为:
void (*MouseCallback)(int event,
int x,
int y,
int flags,
void* userdata);
- event 是EVENT_+变量之一
- x 和y 是鼠标指针在图像坐标系(需要注意,不是窗口坐标系)中的坐标值
- flags 是EVENT_FLAG 的组合
- userdata 是用户定义的传递到SetMouseCallback 函数调用的参数。如EVENT_MOUSEMOVE 为鼠标移动消息、EVENT_LBUTTONDOWN 为鼠标左键按下消息等。
event类型:
//! Mouse Events see cv::MouseCallback
enum MouseEventTypes {
EVENT_MOUSEMOVE = 0, //!< indicates that the mouse pointer has moved over the window.
EVENT_LBUTTONDOWN = 1, //!< indicates that the left mouse button is pressed.
EVENT_RBUTTONDOWN = 2, //!< indicates that the right mouse button is pressed.
EVENT_MBUTTONDOWN = 3, //!< indicates that the middle mouse button is pressed.
EVENT_LBUTTONUP = 4, //!< indicates that left mouse button is released.
EVENT_RBUTTONUP = 5, //!< indicates that right mouse button is released.
EVENT_MBUTTONUP = 6, //!< indicates that middle mouse button is released.
EVENT_LBUTTONDBLCLK = 7, //!< indicates that left mouse button is double clicked.
EVENT_RBUTTONDBLCLK = 8, //!< indicates that right mouse button is double clicked.
EVENT_MBUTTONDBLCLK = 9, //!< indicates that middle mouse button is double clicked.
EVENT_MOUSEWHEEL = 10,//!< positive and negative values mean forward and backward scrolling, respectively.
EVENT_MOUSEHWHEEL = 11 //!< positive and negative values mean right and left scrolling, respectively.
};
实例代码:我们可以通过鼠标左键的按下和松开来在黑色的窗口中绘制出一个一个彩色的矩形。
#include <opencv2/opencv.hpp>
using namespace cv;
#define WINDOW_NAME "【程序窗口】" //为窗口标题定义的宏
void on_MouseHandle(int event, int x, int y, int flags, void* param);
int main(int argc, char** argv)
{
//设置鼠标操作回调函数
namedWindow(WINDOW_NAME);
setMouseCallback(WINDOW_NAME, on_MouseHandle, NULL);
waitKey();
return 0;
}
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{
switch (event)
{
//鼠标移动消息
case EVENT_MOUSEMOVE:
{
printf("鼠标移动消息\n");
}
break;
//左键按下消息
case EVENT_LBUTTONDOWN:
{
printf("左键按下消息\n");
}
break;
//左键抬起消息
case EVENT_LBUTTONUP:
{
printf("左键抬起消息");
}
break;
}
}
运行结果: