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

10 篇文章 2 订阅

前言

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

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知来者逆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值