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

鼠标操作

一 函数定义

指定鼠标操作消息回调函数,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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值