前言
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;
}
}