• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

OpenCV鼠标事件

武飞扬头像
音视频开发老舅
帮助1

1、简介

鼠标事件使用传统的回调函数机制来完成。我们事先写好一个回调程序,在OpenCV发生任何鼠标事件时,都会调用这个程序。

2、鼠标事件回调函数原型

  1.  
    void mouse_callback(
  2.  
    int event,
  3.  
    int x,
  4.  
    int y,
  5.  
    int flags,
  6.  
    void* parmas);

event: 鼠标事件类型

学新通

  • x: 鼠标事件发生时的x坐标。这里的坐标是图像上的像素坐标
  • y: 鼠标事件发生时的y坐标。
  • flags: 标志位,每一个位表示不同的条件,具体条件如下

学新通

  • params: 用于传递额外的信息给鼠标事件

3、鼠标注册函数

  1.  
    void cv::setMouseCallback(
  2.  
    const string& windowName,
  3.  
    cv::MouseCallback on_mouse,
  4.  
    void* param = NULL
  5.  
    );
  • windowName: 回调函数作用的窗口名称
  • on_mouse: 要注册的回调函数
  • param: 给回调函数传递的参数

4、简单绘图例子

  1.  
    #include <QCoreApplication>
  2.  
    #include "opencv2/opencv.hpp"
  3.  
     
  4.  
    void my_mouse_callback(int event, int x, int y, int flags, void* param); //自己定义的鼠标事件回调函数
  5.  
     
  6.  
    cv::Rect box;
  7.  
    bool drawing_box = false;
  8.  
     
  9.  
    void draw_box(cv::Mat& img, cv::Rect box)
  10.  
    {
  11.  
    cv::rectangle(img, box.tl(), box.br(), cv::Scalar(0x00, 0x00, 0xFF));//BGR画红色的框
  12.  
    }
  13.  
     
  14.  
    int main(int argc, char *argv[])
  15.  
    {
  16.  
    QCoreApplication a(argc, argv);
  17.  
     
  18.  
    box = cv::Rect(-1, -1, 0, 0);
  19.  
    cv::Mat img(200, 200, CV_8UC3), temp;
  20.  
    img.copyTo(temp); //使用copyTo复制一个img类
  21.  
     
  22.  
    img = cv::Scalar::all(0); //给img所有像素初始化为黑色
  23.  
    cv::namedWindow("DBox_test"); //创建一个显示窗口
  24.  
     
  25.  
    //注册自己的鼠标回调
  26.  
    cv::setMouseCallback("DBox_test", my_mouse_callback, (void*)&img);
  27.  
     
  28.  
    for (;;) {
  29.  
    img.copyTo(temp);
  30.  
    if(drawing_box)
  31.  
    draw_box(temp, box);
  32.  
    cv::imshow("DBox_test", temp);
  33.  
     
  34.  
    if(cv::waitKey(15) == 27)
  35.  
    break;
  36.  
    }
  37.  
    return a.exec();
  38.  
    }
  39.  
     
  40.  
    void my_mouse_callback(int event, int x, int y, int flags, void* param)
  41.  
    {
  42.  
    cv::Mat& image = *(cv::Mat*)param;
  43.  
     
  44.  
    switch (event) {
  45.  
    case cv::EVENT_MOUSEMOVE:
  46.  
    //在绘画状态中,鼠标移动时,记录当前xy轴,绘制矩形
  47.  
    if(drawing_box) {
  48.  
    box.width = x - box.x;
  49.  
    box.height = y - box.y;
  50.  
    }
  51.  
    break;
  52.  
    case cv::EVENT_LBUTTONDOWN:
  53.  
    drawing_box = true; //鼠标左键按下,开始绘制
  54.  
    box = cv::Rect(x, y, 0, 0); //记录鼠标左键按下时的x,y轴,作为矩形起点
  55.  
    break;
  56.  
    case cv::EVENT_LBUTTONUP:
  57.  
    drawing_box = false; //鼠标左键松开,绘制完成
  58.  
    if(box.width < 0) {
  59.  
    box.x = box.width; //鼠标向左边运行,x轴负增长,所以这里取反
  60.  
    box.width *= -1;
  61.  
    }
  62.  
    if(box.height < 0) {
  63.  
    box.y = box.height; //鼠标向上方运行,y轴负增长,取反
  64.  
    box.height *= -1;
  65.  
    }
  66.  
    draw_box(image, box);
  67.  
    break;
  68.  
    }
  69.  
    }
  70.  
     
学新通

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C 语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhackkc
系列文章
更多 icon
同类精品
更多 icon
继续加载