前言

1.使用Qt与OpenCV做开发时,时常会用到鼠标与图像交互这块,OpenCV有自己的鼠标事件,但要在Qt搭建的界面上是不能使用OpenCV封装的鼠标事件,Qt有自己的鼠标事件。
2.Qt鼠标事件:

protected:void mousePressEvent(QMouseEvent *event); //鼠标单击动作void mouseReleaseEvent(QMouseEvent *event); //鼠标释放动作void mouseDoubleClickEvent(QMouseEvent *event); //鼠标双击动作void mouseMoveEvent(QMouseEvent *event); //鼠标移动动作void wheelEvent(QWheelEvent *event); //鼠标滑轮动作

3.要在QLabel里的画矩形并按所画的矩形剪切图像,要重写鼠标事情,然后结合OpenCV的ROI把图像剪切出来,运行效果如下:

代码

#include "mousechoose.h"MouseChoose::MouseChoose(QWidget *parent) : QLabel(parent)
{setMouseTracking(true);//图像大小自动调整为Qlabel大小//setScaledContents(true);is_pressed = false;
}MouseChoose::~MouseChoose()
{}void MouseChoose::loadMat(cv::Mat &src)
{qt_img = matToQImage(src);cv_src = src;qt_pixmap = QPixmap::fromImage(qt_img);
}void MouseChoose::paintEvent(QPaintEvent *e)
{QLabel::paintEvent(e);QPainter painter(this);//设置画笔,颜色、宽度QPen pen;pen.setColor(Qt::red);pen.setWidth(2);painter.setPen(pen);//painter.drawPixmap(0, 0, this->width(), this->height(), qt_pixmap);//painter.setViewport(0, 0, this->width(), this->height());if (is_pressed){qt_rect = QRect(start_point, end_point);painter.drawRect(qt_rect);}
}void MouseChoose::mousePressEvent(QMouseEvent *e)
{if (e->buttons()&Qt::LeftButton){start_point = e->pos();end_point = e->pos();is_pressed = true;}update();QLabel::mousePressEvent(e);
}void MouseChoose::mouseReleaseEvent(QMouseEvent *e)
{is_pressed = false;if (e->button() == Qt::LeftButton){if (start_point.x() > end_point.x() && start_point.y() > end_point.y()){QPoint tmp = start_point;start_point = end_point;end_point = tmp;}getDistrict();}
}void MouseChoose::mouseMoveEvent(QMouseEvent *e)
{if (e->buttons()&Qt::LeftButton){if (is_pressed){end_point = e->pos();update();}}
}void MouseChoose::getDistrict()
{int width = abs(end_point.x() - start_point.x());int height = abs(end_point.y() - start_point.y());double w_scale_value = double(qt_pixmap.width()) / double(this->width());double h_scale_value = double(qt_pixmap.height()) / double(this->height());cv_rect.x = start_point.x()*w_scale_value;cv_rect.y = start_point.y()*h_scale_value;cv_rect.width = width*w_scale_value;cv_rect.height = height*h_scale_value;//显示roi截图cv_dst = cv_src(cv_rect).clone();cv::namedWindow("src", 0);cv::imshow("src", cv_dst);
}void MouseChoose::mouseDoubleClickEvent(QMouseEvent *e)
{if (e->buttons()&Qt::LeftButton){double_point = e->pos();double w_scale_value = double(qt_pixmap.width()) / double(this->width());double h_scale_value = double(qt_pixmap.height()) / double(this->height());cv_point.x = double_point.x()*w_scale_value;cv_point.y = double_point.y()*h_scale_value;}
}

Qt与OpenCV编程:在QLabel加载的图像上画矩形并剪切相关推荐

  1. OpenCV将GIS数据加载到OpenCV容器中的实例(附完整代码)

    OpenCV将GIS数据加载到OpenCV容器中的实例 OpenCV将GIS数据加载到OpenCV容器中的实例 OpenCV将GIS数据加载到OpenCV容器中的实例 #include "o ...

  2. python使用OpenCV加载图像为RGB图并可视化加载的图像(Convert to RGB and show image)

    python使用OpenCV加载图像为RGB图并可视化加载的图像(Convert to RGB and show image) 目录 python使用OpenCV加载图像为RGB图并可视化加载的图像( ...

  3. Opencv 发布程序 无法加载DLL 找不到指定的模块 0x8007007E

    Opencv 发布程序 无法加载DLL 找不到指定的模块 0x8007007E 做大神的搬运,如有侵权请联系删除. 大神地址:点击这里 说一说解决问题路径: 我的运行环境; win10 64位 + V ...

  4. pytorch无法将模型加载到gpu上

    通常是model = model.to(cuda)就好了 但由于搭建模型的时候,forward函数的代码直接调用这个类外部的函数,如图所示: 在这里直接调用了外部的函数, 这个函数里面有torch.n ...

  5. mui用ajax上拉加载更多,mui上拉加载更多的使用

    demo地址 mui框架中上拉加载的坑 1.在函数自己上拉加载行为后的回调函数 2.在mui封装的上拉加载中,点击某一项会失效. 解决方法 1.该函数是必须要写的,用来写自己的逻辑需求,但是一般情况下 ...

  6. android webview 像素,Android:在WebView中加载的图像中的像素质量降低

    我正在为移动浏览器构建Javascript应用程序(不包装为原生应用程序). 我注意到,如果图像尺寸超过特定阈值(宽度超过1400像素左右),Android(经过测试的2.3模拟器和Galaxy S设 ...

  7. html加载超大像素图片,html – 首先加载低分辨率背景图像,然后加载高分辨率图像...

    这是我使用的方法 CSS: #div_whatever { position: whatever; background-repeat: no-repeat; background-position: ...

  8. 微信小程序 下拉刷新/上拉加载更多 (上拉加载更多怎么实现)

    参考:微信小程序开发文档->框架>逻辑层->注册页面 实现原理: 1.下拉刷新:由于小程序数据是实时渲染的.我们把data{}内的数据清空重新加载即可实现下拉刷新. 2.上拉加载更多 ...

  9. Qt 之QWebEngineVie框架简介及加载网页方法

    文章目录 基于Widget的QWebEngine架构 QWebEngineView 关于QWebEngineView下QWebEnginePage的疑问 QWebEnginePage page和pro ...

最新文章

  1. python同名包_可以使用两个同名的Python包吗?
  2. MATLAB在数学建模中的应用(三)
  3. 突发!百度CEO李彦宏被当中泼了一瓶水,肇事者网名:直男上树
  4. layer绑定回车事件(转)
  5. java乱码base64,解决 JAVA WebSocket 解析 base64 后中文字符串乱码
  6. cgcs2000大地坐标系地图_为什么要从北京54和西安80统一到CGCS2000?测绘人必知!...
  7. pandas 更改单元格的值_懂Excel轻松入门Python数据分析包pandas(二十四):连续区域...
  8. python 物理学中的应用_大学物理中Python的应用
  9. 字母三角形c语言ABBBCCCCC,C语言输出ABBBCCCCCDDDDDDDCCCCCBBBA
  10. C++数据结构与算法 动态规划
  11. 用matlab抽样定理验证,用MATLAB验证时域抽样定理
  12. linux的manual手册不存在,在 Linux 命令行下使用“原力”
  13. 得知发行组长老潘今天岗位上最后一天就要离开有感
  14. mysql实现斐波那契,C#实现斐波那契数列的几种方法整理
  15. h5微信游戏服务器,H5游戏微信大型帮派战源码分享 带服务器端+客户端
  16. 使用原配的SSD安装和引导DSM5.2 5644 基于zmouse和Formater教程
  17. 假如古人用上了区块链技术
  18. 电脑下载了自动捆绑怎么办?一招秒杀!
  19. Python每日一记192计算机组成原理之存储器存取周期、存储器带宽
  20. 海康威视错误代码0xf_调用海康威视sdk获取车牌号

热门文章

  1. hdp分享码2020_和平精英2020黄金风衣龙cdk兑换码
  2. python中easygui最新下载教程_python怎么下载easygui
  3. java 文件字节流_Java:文件字符流和字节流的输入和输出
  4. linux换源 最最简单
  5. 【Linux】5.linux下的export命令和环境变量
  6. 代码回滚:Reset、Checkout、Revert 的选择
  7. mybatis mapper.xml --注释 带参数的坑
  8. Spring实现AOP的4种方式
  9. JVM 调优 —— GC 长时间停顿问题及解决方法
  10. Oracle编程入门经典 第7章 表