Qt与OpenCV编程:在QLabel加载的图像上画矩形并剪切
前言
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加载的图像上画矩形并剪切相关推荐
- OpenCV将GIS数据加载到OpenCV容器中的实例(附完整代码)
OpenCV将GIS数据加载到OpenCV容器中的实例 OpenCV将GIS数据加载到OpenCV容器中的实例 OpenCV将GIS数据加载到OpenCV容器中的实例 #include "o ...
- python使用OpenCV加载图像为RGB图并可视化加载的图像(Convert to RGB and show image)
python使用OpenCV加载图像为RGB图并可视化加载的图像(Convert to RGB and show image) 目录 python使用OpenCV加载图像为RGB图并可视化加载的图像( ...
- Opencv 发布程序 无法加载DLL 找不到指定的模块 0x8007007E
Opencv 发布程序 无法加载DLL 找不到指定的模块 0x8007007E 做大神的搬运,如有侵权请联系删除. 大神地址:点击这里 说一说解决问题路径: 我的运行环境; win10 64位 + V ...
- pytorch无法将模型加载到gpu上
通常是model = model.to(cuda)就好了 但由于搭建模型的时候,forward函数的代码直接调用这个类外部的函数,如图所示: 在这里直接调用了外部的函数, 这个函数里面有torch.n ...
- mui用ajax上拉加载更多,mui上拉加载更多的使用
demo地址 mui框架中上拉加载的坑 1.在函数自己上拉加载行为后的回调函数 2.在mui封装的上拉加载中,点击某一项会失效. 解决方法 1.该函数是必须要写的,用来写自己的逻辑需求,但是一般情况下 ...
- android webview 像素,Android:在WebView中加载的图像中的像素质量降低
我正在为移动浏览器构建Javascript应用程序(不包装为原生应用程序). 我注意到,如果图像尺寸超过特定阈值(宽度超过1400像素左右),Android(经过测试的2.3模拟器和Galaxy S设 ...
- html加载超大像素图片,html – 首先加载低分辨率背景图像,然后加载高分辨率图像...
这是我使用的方法 CSS: #div_whatever { position: whatever; background-repeat: no-repeat; background-position: ...
- 微信小程序 下拉刷新/上拉加载更多 (上拉加载更多怎么实现)
参考:微信小程序开发文档->框架>逻辑层->注册页面 实现原理: 1.下拉刷新:由于小程序数据是实时渲染的.我们把data{}内的数据清空重新加载即可实现下拉刷新. 2.上拉加载更多 ...
- Qt 之QWebEngineVie框架简介及加载网页方法
文章目录 基于Widget的QWebEngine架构 QWebEngineView 关于QWebEngineView下QWebEnginePage的疑问 QWebEnginePage page和pro ...
最新文章
- python同名包_可以使用两个同名的Python包吗?
- MATLAB在数学建模中的应用(三)
- 突发!百度CEO李彦宏被当中泼了一瓶水,肇事者网名:直男上树
- layer绑定回车事件(转)
- java乱码base64,解决 JAVA WebSocket 解析 base64 后中文字符串乱码
- cgcs2000大地坐标系地图_为什么要从北京54和西安80统一到CGCS2000?测绘人必知!...
- pandas 更改单元格的值_懂Excel轻松入门Python数据分析包pandas(二十四):连续区域...
- python 物理学中的应用_大学物理中Python的应用
- 字母三角形c语言ABBBCCCCC,C语言输出ABBBCCCCCDDDDDDDCCCCCBBBA
- C++数据结构与算法 动态规划
- 用matlab抽样定理验证,用MATLAB验证时域抽样定理
- linux的manual手册不存在,在 Linux 命令行下使用“原力”
- 得知发行组长老潘今天岗位上最后一天就要离开有感
- mysql实现斐波那契,C#实现斐波那契数列的几种方法整理
- h5微信游戏服务器,H5游戏微信大型帮派战源码分享 带服务器端+客户端
- 使用原配的SSD安装和引导DSM5.2 5644 基于zmouse和Formater教程
- 假如古人用上了区块链技术
- 电脑下载了自动捆绑怎么办?一招秒杀!
- Python每日一记192计算机组成原理之存储器存取周期、存储器带宽
- 海康威视错误代码0xf_调用海康威视sdk获取车牌号
热门文章
- hdp分享码2020_和平精英2020黄金风衣龙cdk兑换码
- python中easygui最新下载教程_python怎么下载easygui
- java 文件字节流_Java:文件字符流和字节流的输入和输出
- linux换源 最最简单
- 【Linux】5.linux下的export命令和环境变量
- 代码回滚:Reset、Checkout、Revert 的选择
- mybatis mapper.xml --注释 带参数的坑
- Spring实现AOP的4种方式
- JVM 调优 —— GC 长时间停顿问题及解决方法
- Oracle编程入门经典 第7章 表