QT内label控件通过opencv显示图像

29 篇文章 43 订阅
25 篇文章 0 订阅

1.对pro进行配置,使其能够理解opencv。

INCLUDEPATH+=d:\opencv249\include\opencv\
                    d:\opencv249\include\opencv2\
                    d:\opencv249\include

LIBS+=d:\opencv249\lib\libopencv_calib3d249.dll.a\
        d:\opencv249\lib\libopencv_contrib249.dll.a\
        d:\opencv249\lib\libopencv_core249.dll.a\
        d:\opencv249\lib\libopencv_features2d249.dll.a\
        d:\opencv249\lib\libopencv_flann249.dll.a\
        d:\opencv249\lib\libopencv_gpu249.dll.a\
        d:\opencv249\lib\libopencv_highgui249.dll.a\
        d:\opencv249\lib\libopencv_imgproc249.dll.a\
        d:\opencv249\lib\libopencv_legacy249.dll.a\
        d:\opencv249\lib\libopencv_ml249.dll.a\
        d:\opencv249\lib\libopencv_objdetect249.dll.a\
        d:\opencv249\lib\libopencv_video249.dll.a

2.在*.ui内创建两个命令按钮,一个标签。其界面为:


3.配置其.h文件、.cpp文件。

.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    cv::Mat image;
      QImage img;

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QFileDialog>
#include <QMessageBox>
#include <opencv/cv.h>
#include <QTextCodec>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_pushButton_clicked()
{
    QString filename = QFileDialog::getOpenFileName(this,tr("Open Image"),"",tr("Image File(*.bmp *.jpg *.jpeg *.png)"));
       QTextCodec *code = QTextCodec::codecForName("gb18030");
       std::string name = code->fromUnicode(filename).data();
       image = cv::imread(name);
       if(!image.data)
       {
           QMessageBox msgBox;
           msgBox.setText(tr("image data is null"));
           msgBox.exec();
       }
       else
       {
           cv::cvtColor(image,image,CV_BGR2RGB);
           img = QImage((const unsigned char*)(image.data),image.cols,image.rows, image.cols*image.channels(),  QImage::Format_RGB888);
           ui->label->clear();
           ui->label->setPixmap(QPixmap::fromImage(img));
           //ui->processPushButton->setEnabled(true);
           ui->label->resize(ui->label->pixmap()->size());
       }
}

void MainWindow::on_pushButton_2_clicked()
{
    cv::flip(image,image,1);
       img = QImage((const unsigned char*)(image.data),image.cols,image.rows,image.cols*image.channels(),  QImage::Format_RGB888);
       ui->label->setPixmap(QPixmap::fromImage(img));
}

补充:

image.cols*image.channels()
可以改为image.step.

参考资料:

1.使用Qt显示openCV矩阵图片    http://blog.csdn.net/homechao/article/details/8989641

2. Qt中用QLabel显示OpenCV中Mat图像数据出现扭曲现象的解决    http://lovelittlebean.blog.163.com/blog/static/11658218620125208212189/

您好!对于在Qt中使用OpenCV控件并在视频图像显示之前的问题,可以按照以下步骤进行操作: 1. 首先,确保已经正确地集成了QtOpenCV库到您的项目中。 2. 创建一个Qt窗口应用程序,并在UI设计中添加一个控件用于显示视频图像,例如一个QLabel。 3. 在您的代码中,使用OpenCV读取视频文件或者从摄像头捕获视频帧。 4. 将捕获到的视频帧转换为Qt图像格式,例如QImage。 5. 将转换后的图像设置给QLabel控件进行显示。 下面是一些示例代码,帮助您理解如何在Qt中实现这个功能: ```cpp #include <QApplication> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建Qt窗口和控件 QLabel label; label.show(); cv::VideoCapture capture("path_to_video_file"); // 替换为您的视频文件路径或者摄像头索引 QTimer timer; QObject::connect(&timer, &QTimer::timeout, [&]() { cv::Mat frame; capture >> frame; if (!frame.empty()) { // 将OpenCV的Mat转换为Qt的QImage QImage image(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888); image = image.rgbSwapped(); // 如果图像是BGR格式,需要进行颜色通道交换 // 将图像设置给QLabel控件进行显示 label.setPixmap(QPixmap::fromImage(image).scaled(label.size(), Qt::KeepAspectRatio)); } }); // 设置定时器的时间间隔,控制视频帧的刷新率 timer.setInterval(33); // 30帧/秒 // 启动定时器 timer.start(); return app.exec(); } ``` 请注意,以上代码仅为示例,您需要根据您的实际需求进行调整和扩展。希望对您有帮助!如有任何问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

superdont

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

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

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

打赏作者

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

抵扣说明:

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

余额充值