将OpenCV图像放到QLabel中,并通过鼠标事件获取点击位置

将OpenCV图像放到QLabel中,并通过鼠标事件获取点击位置

关于使用鼠标事件获取点击位置,可以参考两篇博客:

Qt 为QPushButton、QLabel添加鼠标移入移出事件

qt使用鼠标事件获取鼠标在QLabel和Ui界面中的点击位置

题目所说的需求主要有两个重点:
一是将使用opencv打开的图像放在QLabel当中;
二是获取鼠标点击位置,其实opencv也有鼠标事件获取点击的像素点的位置,但是放到了QLabel中如何使用我从网上查也没有查到好使的,于是退而求其次,使用QLabel的鼠标事件通过转换来实现功能。

我的工程名字是 mouse_in_qtUi

mouse_in_qtUi.pro

#-------------------------------------------------
#
# Project created by QtCreator 2019-12-24T22:54:02
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = mouse_in_qtUi
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11
CONFIG += link_pkgconfig
PKGCONFIG +=opencv

SOURCES += \
        main.cpp \
        mylabel.cpp \
        widget.cpp

HEADERS += \
        mylabel.h \
        widget.h

FORMS += \
        widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

mylabel.h

#ifndef MYLABEL_H
#define MYLABEL_H

#include
#include
extern int x_in_Label, y_in_Label, x_in_Ui, y_in_Ui, x_in_Img, y_in_Img;

class MyLabel :public QLabel
{
Q_OBJECT;
public:
    MyLabel(QWidget *parent = 0);
    ~MyLabel();
public:

    void mousePressEvent(QMouseEvent *e);    //按下

};

#endif // MYLABEL_H

mylabel.cpp

#include "mylabel.h"
#include 

int x_in_Label, y_in_Label, x_in_Ui, y_in_Ui, x_in_Img, y_in_Img;
MyLabel::MyLabel(QWidget* parent) :QLabel(parent)
{

}
MyLabel::~MyLabel()
{

}

void MyLabel::mousePressEvent(QMouseEvent *e)
{
    x_in_Label = e->x();
    y_in_Label = e->y();
    x_in_Ui = geometry().x() +x_in_Label;
    y_in_Ui = geometry().y() + y_in_Label;
    //这里需要知道输入图像的大小,然后根据缩放关系求出相应位置
    x_in_Img = x_in_Label* 640/width();
    y_in_Img = y_in_Label * 458/height();
    std::cout << "mouse_in_label: "<< x_in_Label <<","<< y_in_Label
                      <<  "    mouse_in_Ui: " << x_in_Ui << "," << y_in_Ui
                      << "    mouse_in_Img: " <<x_in_Img <<"," << y_in_Img<< std::endl;

}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

/**********************************************************************************
 *  Name:            mouse_in_qtUi
 *  Version:
 *  Author:         mk90
 *  Time:            2020-01-15  13:12:22
 *  Blog:            https://me.csdn.net/weixin_44100850
 *  Brief :          将图片放在QLabel中,鼠标左键点击获取图像像素位置,以及鼠标在界面中的绝对位置
 *
***********************************************************************************/

#include "widget.h"
#include "ui_widget.h"
#include "mylabel.h"
#include 
#include 

using namespace cv;
using namespace std;

cv::Mat src;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    cv::Mat src = cv::imread("/home/mk90/Pictures/nvpai.jpeg");

    cv::cvtColor(src, src, CV_BGR2RGB);//BGR convert to RGB
    QImage Qtemp = QImage((const unsigned char*)(src.data), src.cols, src.rows, src.step, QImage::Format_RGB888);
    QImage newQtemp = Qtemp.scaled(ui->label->size());
    ui->label->setPixmap(QPixmap::fromImage(newQtemp));
    ui->label->show();
}

Widget::~Widget()
{
    delete ui;
}

结果:
将OpenCV图像放到QLabel中,并通过鼠标事件获取点击位置_第1张图片

你可能感兴趣的:(C++,QT,qt,OpenCv,QLabel,鼠标事件)