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

整个工程地址:https://download.csdn.net/download/matt45m/12055957

发布了79 篇原创文章 · 获赞 45 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/matt45m/article/details/103741519