鼠标操作
一 函数定义
指定鼠标操作消息回调函数,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为以下事件
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);