opencv(6)---鼠标与滑动条操作

来源:互联网 发布:视频剪辑软件排名 编辑:程序博客网 时间:2024/06/04 23:00

鼠标操作

一 函数定义

指定鼠标操作消息回调函数,setMouseCallback(),原型如下

CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);

winname—–窗口名

onMouse—–鼠标事件时被调用的函数指针,原型形式:

  void Fun(int event, int x, int y, int flags, void* param);

其中,event事件为以下事件
这里写图片描述
flags为以下事件
fags

userdata —–用户定义传到回调函数的参数,默认值0

二 代码

1.功能:在按键按下的时候,以按键按下的点为圆心,绘制圆
代码1

#include "mainwindow.h"#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;void OnMouse(int event,int x,int y,int flags,void *param){    Mat img=*(Mat*)param;    if(event==CV_EVENT_LBUTTONDOWN)    {        cout<<"Mouse down"<<endl;        circle(img,Point(x,y),80,Scalar(255,255,255),2,8);    }}MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    Mat img(500,500,CV_8UC3,Scalar(255,255,0));    namedWindow("Mouse",CV_WINDOW_AUTOSIZE);    setMouseCallback("Mouse",OnMouse,&img);    while(1){    imshow("Mouse",img);    if(27==waitKey(10))//按下ESC跳出循环        break;    }}MainWindow::~MainWindow(){}

运行结果

这里写图片描述
2. 功能:鼠标按下时记录点的坐标,鼠标左键抬起绘制矩形
代码:

#include "mainwindow.h"#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;Point pt;void OnMouse(int event,int x,int y,int flags,void *param){    Mat img=*(Mat*)param;    switch(event){    case CV_EVENT_LBUTTONDOWN:        pt.x=x;        pt.y=y;        break;    case CV_EVENT_LBUTTONUP:        rectangle(img,pt,Point(x,y),Scalar(255,255,255),2,8);        break;    default:        break;    }}MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    Mat img(500,500,CV_8UC3,Scalar(255,255,0));    namedWindow("Mouse",CV_WINDOW_AUTOSIZE);    setMouseCallback("Mouse",OnMouse,&img);    while(1){    imshow("Mouse",img);    if(27==waitKey(10))//按下ESC跳出循环        break;    }}MainWindow::~MainWindow(){}

运行结果
这里写图片描述

二 滑动条操作

创建滑动条并指定回调函数 createTrackbar()

1. 函数原型

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

trackbarname—–滚动条名称
winname—–滚动条所依附的窗口名称(namedWindow创建)
value—-指向型指针,表示滑动块位置
count—滑动块最大位置,默认最小为0
onChange—-指向回调函数的指针,原型必须为void xxx(int, void*);
userdata —–用户传给回调函数的数据,默认值0

2. 代码

#include "mainwindow.h"#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;Mat srcImage;Mat dstImage;int value=20;void OnChange(int ,void *){    //threshold(srcImage,dstImage,value,255,THRESH_BINARY);    Canny(srcImage,dstImage,value,255);    imshow("TrackBar",dstImage);}MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    srcImage=imread("D:\\1\\1.png");    namedWindow("TrackBar",CV_WINDOW_AUTOSIZE);    createTrackbar("Threshold","TrackBar",&value,255,OnChange,0);    waitKey(0);}MainWindow::~MainWindow(){}

3. 运行结果

这里写图片描述

4. 知识点拓展

1. 设置滚动条当前位置

CV_EXPORTS_W void setTrackbarPos(const String& trackbarname, const String& winname, int pos);

例子:

 setTrackbarPos("FRAME","Video",framePos);

2. 获取滚动条当前位置
函数原型

CV_EXPORTS_W int getTrackbarPos(const String& trackbarname, const String& winname);

3.获取视频帧当前位置

framePos=cap.get(CV_CAP_PROP_POS_FRAMES);

4. 设置视频帧当前位置

 cap.set(CV_CAP_PROP_POS_FRAMES,value);
0 0
原创粉丝点击