Qt_C++多线程-/-实时显示工业摄像头图像到Label

.h:

#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication1.h"
#include <QThread>

/*线程类*/
class Thread : public QThread 
{
	Q_OBJECT

public:
	Thread();  //构造函数

signals:
	void returnResult(int);//信号

protected:
	void run();
};

/*窗口类*/
class QtGuiApplication1 : public QMainWindow
{
	Q_OBJECT

public:
	QtGuiApplication1(QWidget *parent = Q_NULLPTR);

private slots:
	void test();//按钮事件
	void displayResult(int);//信号回调

private:
	Ui::QtGuiApplication1Class ui;
	Thread* thread;
};

.cpp:

#include "QtGuiApplication1.h"
#include "ui_QtGuiApplication1.h"
#include<DVPCamera.h>

#pragma comment(lib, "DVPCamera.lib")

dvpHandle CameraHandle_t;//相机句柄
dvpFrame pFrame;//帧数据
void* pBuffer;//帧地址
QImage g_image;

QtGuiApplication1::QtGuiApplication1(QWidget *parent): QMainWindow(parent)
{
	ui.setupUi(this);

	thread = new Thread();
	connect(thread, SIGNAL(returnResult(int)), this, SLOT(displayResult(int)));//信号槽

	dvpUint32 n = 0;//相机数量
	dvpRefresh(&n);//刷新相机,返回连接的相机数量
	dvpOpen(0, dvpOpenMode(OPEN_NORMAL), &CameraHandle_t);//打开相机
	dvpStart(CameraHandle_t);//启动视频流
}

/*按钮事件*/
void QtGuiApplication1::test()
{
	thread->start();//启动新线程
}

Thread::Thread()
{
}

/*线程循环*/
void Thread::run()
{
	int result=0;
	while (1)
	{
		msleep(50);//延时50ms
		emit returnResult(result);  //发送信号
	}
}

/*信号回调*/
void QtGuiApplication1::displayResult(int result)
{
	dvpGetFrame(CameraHandle_t, &pFrame, &pBuffer, 3000);//获取一帧数据
	QImage tmpImg((uchar*)pBuffer, pFrame.iWidth, pFrame.iHeight, QImage::Format_Indexed8);//BGR24-Format_BGR888\MONO8、16、RAW8-Format_Indexed8\RAW12-Format_Grayscale16
	g_image = tmpImg.scaled(tmpImg.width() * 0.5, tmpImg.height() * 0.5, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);//缩放图像,SmoothTransformation平滑缩放,FastTransformation快速缩放
	ui.label->setPixmap(QPixmap::fromImage(g_image));//显示图像到Label
}
/*
帧数据转为QImage格式
多线程发送信号
*/

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt中,可以使用QThread类来实现多线程接收图像数据。具体步骤如下: 1. 继承QThread类,重写run()函数,在该函数中编写接收图像数据的代码。 2. 在主线程中创建该自定义线程对象,并通过信号槽机制将图像数据传递给主线程。 3. 在run()函数中使用Qt网络模块中的QTcpSocket类或QUdpSocket类来接收图像数据。 4. 在接收到数据后,使用信号槽机制将数据传递给主线程。可以使用Qt的QImage类来处理图像数据。 5. 在主线程中将接收到的图像数据显示在UI界面上。 下面是一个简单的示例代码: ```c++ //自定义线程类 class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr); protected: void run() override; signals: void imageReceived(QImage image); //图像数据信号 private: QTcpSocket *socket; //TCP套接字 }; MyThread::MyThread(QObject *parent) : QThread(parent) { socket = new QTcpSocket(this); connect(socket, &QTcpSocket::readyRead, this, [this](){ //接收到数据 QByteArray data = socket->readAll(); QImage image; image.loadFromData(data); //将字节数组转换为图像 emit imageReceived(image); //发送图像数据信号 }); } void MyThread::run() { socket->connectToHost("127.0.0.1", 8888); //连接到服务器 exec(); //开始事件循环 } //主窗口类 class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: QLabel *label; //用于显示图像的标签 MyThread *thread; //自定义线程对象 }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { label = new QLabel(this); setCentralWidget(label); thread = new MyThread(this); connect(thread, &MyThread::imageReceived, this, [this](QImage image){ //接收到图像数据,更新UI界面 label->setPixmap(QPixmap::fromImage(image)); }); thread->start(); //启动自定义线程 } MainWindow::~MainWindow() { delete ui; } ``` 在上面的代码中,我们创建了一个自定义线程类MyThread,重写了run()函数,在该函数中使用QTcpSocket类接收图像数据。在接收到数据后,通过信号槽机制将图像数据传递给主线程。主窗口类MainWindow中创建了一个QLabel对象用于显示图像,创建了一个MyThread对象,并通过信号槽机制将图像数据显示在UI界面上。在MainWindow的析构函数中需要删除MyThread对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值