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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章