OpenCV是一个著名的计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

程序的大致效果就是:显示一张较大的图像,鼠标在图像上移动的时候会实时的显示一个"十"字的交叉线,然后在图像上点两个点得到的矩形框就是感兴趣区域。

一、介绍一下OpenCV中如何设置鼠标事件的回调函数

1)设置鼠标回调函数

 void   SetMouseCallback(const string & winname,MouseCallback onMouse,void* userdata=0)

参数说明:

winname: 窗口的名字

onMouse: 鼠标事件发生的时候,调用的函数的函数指针

userdata: 在鼠标事件发生的时候,传给调用函数的参数

2)对第二个参数MouseCallback onMouse的详细说明:

它表示鼠标事件发生的时候,被调用的函数的函数指针,其函数原型为:

void my_mouse(int event, int x, int y, int flags, void* param);
  • event是鼠标事件类型,OpenCV中定义的常见事件有(枚举类型变量):
CV_EVENT_MOUSEMOVE      =0,CV_EVENT_LBUTTONDOWN    =1,CV_EVENT_RBUTTONDOWN    =2,CV_EVENT_MBUTTONDOWN    =3,CV_EVENT_LBUTTONUP      =4,CV_EVENT_RBUTTONUP      =5,CV_EVENT_MBUTTONUP      =6,CV_EVENT_LBUTTONDBLCLK  =7,CV_EVENT_RBUTTONDBLCLK  =8,CV_EVENT_MBUTTONDBLCLK  =9,CV_EVENT_MOUSEWHEEL     =10,CV_EVENT_MOUSEHWHEEL    =11
  • x, y表示鼠标在图像坐标系中的位置
  • flags是CV_EVENT_FLAG的组合,用来表示鼠标拖拽的事件,其状态有:
EVENT_FLAG_LBUTTON //左键拖拽EVENT_FLAG_RBUTTON  //右键拖拽EVENT_FLAG_MBUTTON   //中键拖拽EVENT_FLAG_CTRLKEY  //按住Ctrl不放EVENT_FLAG_SHIFTKEY    //按住Shift不放EVENT_FLAG_ALTKEY                  //按住Alt不放
  • params用来接收函数被调用时,用户传给它的数据(注意是一个void*类型)

二、上代码

#include #include #include using namespace cv;using namespace std;#define WIN_NAME        "Pano"#define PANO_IMAGE_PATH "/home/llf/Pictures/cat.jpg"#define ROI_SAVE_PATH   "/home/llf/Pictures/res_roi.jpg"Mat pano, pano_raw, pano_dst;vector two_points;/* * 鼠标事件回调*/void my_mouse_call_back(int event, int x, int y, int flags, void* param) {    switch (event)    {    case CV_EVENT_MOUSEMOVE:        pano = pano_raw.clone();        line(pano, Point(x, 0), Point(x, pano.rows), Scalar(0, 255, 0), 5);        line(pano, Point(0, y), Point(pano.cols, y), Scalar(0, 255, 0), 5);        break;    case CV_EVENT_LBUTTONDOWN:        if(two_points.size() < 2)        {            Point p(x, y);            two_points.push_back(p);            line(pano_raw, Point(x, 0), Point(x, pano_raw.rows), Scalar(0, 255, 0), 10);            line(pano_raw, Point(0, y), Point(pano_raw.cols, y), Scalar(0, 255, 0), 10);        }        break;    case CV_EVENT_RBUTTONDOWN:    {        Mat roi = pano_dst(Rect(two_points[0], two_points[1]));        namedWindow("roi", WINDOW_NORMAL);        imshow("roi", roi);        waitKey(0);        imwrite(ROI_SAVE_PATH, roi);        destroyWindow("roi");    }        break;    default:        break;    }}int main(int argc, char **argv) {    pano = imread(PANO_IMAGE_PATH, IMREAD_COLOR);    pano_dst = (pano_raw = pano.clone()).clone();     namedWindow(WIN_NAME, WINDOW_NORMAL);    setMouseCallback(WIN_NAME, my_mouse_call_back, NULL);    int key = -1;    while(27 != key) {        imshow(WIN_NAME, pano);        key = waitKey(20);    }    return 0;}

效果:鼠标挪到哪里,十字架的中心就挪到哪里

如果对我的推|文有兴趣,欢迎转|载分|享。也可以推|荐给朋友关|注哦。只推干货,宁缺毋滥。

vs矩形框边框线显示被选中的区域;_如何使用OpenCV可视化的截取感兴趣区域相关推荐

  1. vs矩形框边框线显示被选中的区域;_条形码区域解码:Web小工具

    条形码解码首先要做定位,找到条形码在图像中的区域.但是有时候受图像质量影响,算法找寻的区域可能产生偏差,最后导致解码失败.这个时候,可以尝试手动选择区域,来辅助条形码的识别. Web Canvas框选 ...

  2. vs矩形框边框线显示被选中的区域;_Excel中,重复的数据高亮显示,如何快速删去?...

    快速删去重复数据,雷哥在这里提供4种超简单的解决方法,大家一看就会. 为了更加直接明了地说明,雷哥在这里通过具体案例进行讲解. 案例:下图B列日期中,橘黄色部分是我们已经标记好颜色的重复项. 要求:快 ...

  3. html在边框线中加文本框,怎么设置幻灯片里的文本框边框线?

    通过设置文本框格式来实现 选中刚刚插入的文本框,右键,选择"设置自选图形/图片格式": 在文本框格式中的颜色与线条界面中,将线条的颜色改为无颜色,然后点击保存. 可以用border ...

  4. 基于python的移动物体检测_感兴趣区域的移动物体检测,框出移动物体的轮廓 (固定摄像头, opencv-python)...

    感兴趣区域.特定区域.框出移动物体的轮廓.越界检测.入侵物体检测.使用 opencv-python库的函数cv2.findContours.cv2.approxPolyDP.cv2.arcLength ...

  5. qt自定义窗口,其绘制的窗口边框线显示不全

    引言 自定义窗口,该窗口包含标题栏,默认整个窗口的边框线为蓝色,当点击该窗口的时候,窗口的边框线便为红色.程序在运行的时候,窗口的边框线只显示了左右两边的线,没有显示上下边的线. 示例 效果: 解决方 ...

  6. 设置文本框边框不显示

    <input name="str" style="border: 0px none;" type="text">

  7. rviz显示矩形框BoundingBox

    rviz显示矩形框BoundingBox 类似显示如下BoundingBox 需要安装如下依赖 安装ros-melodic-jsk-recognition-msgs等依赖库 sudo apt-get ...

  8. opencv进阶学习笔记6:使用鼠标在图像上绘制矩形框或者多边形框

    基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录: python+opencv进阶版学习笔记目录(适合有一定基础) 感兴趣区域传统绘制: openc ...

  9. svg 读取SVG文件并绘制矩形框选择图元

    首先是SVG文件,里面包含了几个不同的图元: <?xml version='1.0' standalone='no'?> <!DOCTYPE svg PUBLIC "-// ...

最新文章

  1. Hanlp分词实例:Java实现TFIDF算法
  2. MATLAB 图像函数(第七章) 图像的代数运算
  3. UNITY2018开启deepprofiling
  4. 什么是事务、半事务消息?怎么实现的?
  5. Pipelines - .NET中的新IO API指引(二)
  6. 如何把一个float存到一个长度为4的char数组中?
  7. 介绍个好点的,JAVA技术群
  8. 红黑树(Red-Black Tree)
  9. ORB_SLAM2之Pangolin的安装与问题处理
  10. 学生网页作业——仿华为手机电子商城 (1页) HTML+CSS+JavaScript html网页制作期末大作业成品_网页设计期末作业
  11. Gephi安装教程——1
  12. Hutool做excel的解析
  13. java ieee_Java IEEE754 工具类
  14. 完全零基础,到底该怎样学习编程?
  15. python代码混淆工具,Python版代码混淆工具
  16. 通过读取csv/xml数据并且结合使用allure展示测试报告,验证开发中的add()和reduct()操作(在@allure.story分别实现相加减)
  17. 【算法竞赛】力扣杯春赛-个人赛 LCCUP‘23复盘
  18. 教授建议:科研人员压力太大,应该培养一些吃喝玩乐之类“庸俗”的爱好
  19. android小米手机拍照功能,拍照参数设置界面_小米 M1(MIUI)_手机Android频道-中关村在线...
  20. Noip—p1309 瑞士轮

热门文章

  1. Java前台线程与后台线程
  2. MySQL删除外键约束
  3. Java中IO流的总结
  4. poj2566Bound Found尺取法进阶(java)
  5. 利用MySQL创建一个简单的employee员工表并修改表
  6. 北大OJ百练——2721:忽略大小写比较字符串大小
  7. Haskell语言实现求解一个整数所有因子的代码及运行结果
  8. mint java_Linux mint使用
  9. 精通java图片_面试必备:详解Java I/O流,掌握这些就可以说精通了?
  10. 查询mysql所有对象_Mysql查看数据库对象(SQL命令总结)