GraphView实时图像刷新

代码:

GraphViewTest::GraphViewTest(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
	m_bll = BllData::getInstance();
	connect(m_bll, &BllData::returnImgDataSignal, this, &GraphViewTest::returnImgDataSlot);
	ui.graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	ui.graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	// 设置场景范围
	ui.graphicsView->resize(1440, 1120);
	ui.graphicsView->setSceneRect(INT_MIN / 2, INT_MIN / 2, INT_MAX, INT_MAX);
	// 反锯齿
	ui.graphicsView->setRenderHints(QPainter::Antialiasing);
	m_scene.setBackgroundBrush(Qt::gray);
	ui.graphicsView->setScene(&m_scene);
}

GraphViewTest::~GraphViewTest()
{
	m_bll->~BllData();
}
void GraphViewTest::on_startBtn_clicked() {
	m_bll->startAcq();
}
void GraphViewTest::on_stopBtn_clicked() {
	m_bll->stopAcq();
}
void GraphViewTest::on_openBtn_clicked() {
	QString str = "打开文件";
	QString filepath = QFileDialog::getOpenFileName(this, str);
	qDebug() << "---------------filepath:  " << filepath;
	QByteArray cdata = filepath.toLocal8Bit();
	QStringList listfile = filepath.split('.');
	QString hou = listfile.takeLast();
	if (hou == "tif" || hou == "tiff" || hou == "jpg" || hou == "png") {
		cv::Mat srcimg = cv::imread(std::string(cdata), cv::IMREAD_UNCHANGED);
		int rows = srcimg.rows;
		int cols = srcimg.cols;
		if (rows == BllData::ImageSizeRow && cols == BllData::ImageSizeColumn) {
			quint16* img = BllData::getSingleImg();
			for (int i = 0; i < rows; i++) {
				for (int j = 0; j < cols; j++) {
					img[i * cols + j] = srcimg.at<ushort>(i, j);
				}
			}
			static int cnt = 0;
			cnt++;
			if (cnt == 1) {
				ImageItemObj* imgdata = new ImageItemObj;
				connect(m_bll, &BllData::updateImgDataSignal, imgdata, &ImageItemObj::updateImgDataSlot);
				m_scene.addItem(imgdata);
			}
			m_bll->updateImgData();
		}
	}
}
void GraphViewTest::returnImgDataSlot() {
	static int cnt = 0;
	cnt++;
	if (cnt == 1) {
		imgdata = new ImageItemObj;
		connect(m_bll, &BllData::updateImgDataSignal, imgdata, &ImageItemObj::updateImgDataSlot);
		m_scene.addItem(imgdata);
	}
	m_bll->updateImgData();
	m_scene.update();
}
ImageItemObj::ImageItemObj()
	: QGraphicsPixmapItem()
{
	m_bll = BllData::getInstance();
}
ImageItemObj::~ImageItemObj()
{}
QRectF ImageItemObj::boundingRect() const {
	return QRectF(-4, -4, 8, 8);
}
void ImageItemObj::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {
	Q_UNUSED(option);
	Q_UNUSED(widget);
	qDebug() << "ImageItemObj------------paint----------";
	/**/
	quint16* img = BllData::getSingleImg();
	uchar* imgbit8 = BllData::getImg8bit();
	BllData::converToGray(img, imgbit8, m_width, m_center);
	QRect target(-720, -560, 1440, 1120);
	QImage image(imgbit8, BllData::ImageSizeColumn, BllData::ImageSizeRow, QImage::Format_Grayscale8);
	painter->drawImage(target, image);
}
void ImageItemObj::updateImgDataSlot() {
	quint16* img = BllData::getSingleImg();
	qDebug() << "updateImgDataSlot--------------------data: "<< img[50*50];
	int min, max;
	BllData::getMinMaxData(img, min, max);
	m_width = max - min;
	m_center = (max + min) / 2;
	update();
}
ProduceImgObj::ProduceImgObj(QObject *parent)
	: QObject(parent)
{
	m_acqEnable = false;
	m_path = "";
}

ProduceImgObj::~ProduceImgObj()
{
	qDebug() << "~ProduceImgObj()------------------start-----";
	if (m_timer->isActive())
	{
		m_timer->stop();
		delete m_timer;
	}
	qDebug() << "~ProduceImgObj()------------------end-----";
}

void ProduceImgObj::iniDetSlot() {
	m_path = "bga";
	m_timer = new QTimer;
	m_imgdata = new quint16[ImageSizeRow * ImageSizeColumn];
	memset(m_imgdata, 0, sizeof(quint16) * ImageSizeRow * ImageSizeColumn);
	connect(m_timer, SIGNAL(timeout()), this, SLOT(timeSlot()));
}
void ProduceImgObj::startAcqDataSlot() {
	m_acqEnable = true;
	m_timer->start(16);
}
void ProduceImgObj::stopAcqDataSlot() {
	m_acqEnable = false;
}
void ProduceImgObj::timeSlot() {
	if (!m_acqEnable)
		return;
	QString based = m_path;
	int rnum = qrand() % 35 + 1;
	based.append("/").append(QString::number(rnum)).append(".tiff");
	qDebug() << "filepath:  " << based;
	QByteArray cdata = based.toLocal8Bit();
	cv::Mat imgm = imread(std::string(cdata), cv::IMREAD_UNCHANGED);
	if (imgm.empty())
		return;
	if (imgm.depth() > 0) {
		qDebug() << "imgm.rows: " << imgm.rows;
		for (int i = 0; i < imgm.rows; i++) {
			for (int j = 0; j < imgm.cols; j++) {
				int data = imgm.at<ushort>(i, j);
				m_imgdata[i * imgm.cols + j] = data;
			}
		}
	}
	emit returnImgDataSignal(m_imgdata);
}
BllData::BllData(QObject *parent)
	: QObject(parent)
{
	m_produce = new ProduceImgObj;
	m_thread = new QThread;
	m_produce->moveToThread(m_thread);
	connect(m_thread, &QThread::finished, m_produce, &ProduceImgObj::deleteLater);
	connect(this, &BllData::iniDataSignal, m_produce, &ProduceImgObj::iniDetSlot);
	connect(this, &BllData::startAcqSignal, m_produce, &ProduceImgObj::startAcqDataSlot);
	connect(this, &BllData::stopAcqSignal, m_produce, &ProduceImgObj::stopAcqDataSlot);
	connect(m_produce, &ProduceImgObj::returnImgDataSignal, this, &BllData::returnImgDataSlot);
	emit iniDataSignal();
	m_thread->start();
}
BllData::~BllData()
{
	if (m_thread) {
		if (m_thread->isRunning()) {
			m_thread->quit();
			m_thread->wait();
		}
		delete m_thread;
		m_thread = NULL;
	}
}
BllData* BllData::m_instance = 0;
quint16* BllData::m_img = 0;
uchar* BllData::m_img8bit = 0;
void BllData::updateImgData() {
	emit updateImgDataSignal();
}
void BllData::startAcq() {

	if (!m_thread->isRunning())
		m_thread->start();

	emit startAcqSignal();
}
void BllData::stopAcq() {
	emit stopAcqSignal();
}
void BllData::returnImgDataSlot(quint16* img) {
	quint16* mimg = BllData::getSingleImg();
	memcpy(mimg, img, ImageSizeRow * ImageSizeColumn * sizeof(quint16));
	emit returnImgDataSignal();
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/427030.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ分享

RabbitMQ遵循AMQP协议&#xff0c;自身采用Erlang RabbitMQ工作模式 生产者发消息&#xff0c;启动多个消费者实例来消费消息&#xff0c;每个消费者仅消费部分信息&#xff0c;可达到负载均衡的效果。 RabbitMQ三种常用交换机类型&#xff1a; 交换机主要起调度分发作用。 …

正弦波生成的傅里叶级数展开法

目录&#xff1a; 一、积分法 二、傅里叶级数展开法 附录、常见波形的傅里叶级数 一、积分法 通过对三角波进行积分&#xff0c;即可得到正弦波。有关内容移步&#xff1a;运算放大器应用汇总1之六、积分电路。 下面对傅里叶级数展开法进行描述。 二、傅里叶级数展开法 三…

高通QNX基线编译原理

下面代码以高通智驾平台为例。 1 QNX应用程序编译原理 在高通提供的qnx开发包中,qnx的内核已经由qnx所提供,所以qnx的编译,其实就是大量应用程序的编译,以及最后利用buildfile文件,把内核,库文件以及应用程序打包在一起的过程。 1.1 qnx的工程目录 应用程序的编译,可…

Tomcat服务部署优化

目录 一.Tomcat的基本内容 1.概念 2.构成 &#xff08;1&#xff09;web容器 &#xff08;2&#xff09;servlet容器&#xff08;catalina&#xff09; &#xff08;3&#xff09;JSP容器 3.Tomcat顶层架构 &#xff08;1&#xff09;Tomcat中最顶层的容器是Server&…

运放设计选型中关注的参数-运算放大器选型参数

1、直流增益&#xff08;AVD&#xff09; 直流增益是运放最重要一个属性之一&#xff0c;其定义为输出电压的变化与输入电压变化之比值&#xff0c;通常用V/mV表示这个比值&#xff0c;例如&#xff0c;增益为30000&#xff0c;可表示为30V/mV&#xff0c;有些地方也会把增益用…

盲行的守护者:盲人应用的温暖相伴

作为一个视障人士&#xff0c;我常常对前方的未知感到迷茫。每一步都像是踏入未知的领域&#xff0c;恐惧与不安时刻伴随着我。然而&#xff0c;一款名为蝙蝠避障的盲人手机应用&#xff0c;成为了我前行的明灯。 在这款盲人手机应用的帮助下&#xff0c;我拥有了新的探知世界的…

midjourney提示词语法

更高级的提示可以包括一个或多个图像URL、多个文本短语和一个或更多个参数 Image Prompts 可以将图像URL添加到提示中&#xff0c;以影响最终结果的样式和内容。图像URL总是位于提示的前面。 https://docs.midjourney.com/image-prompts Text Prompt 要生成的图像的文本描述。…

内核中的Kconfig文件

Kconfig解析 编译内核时用于配置的Kconfig文件 以内核中的ttyprintk.c为例&#xff0c;其位于/kernel-sources/dirver/char/ttyprintk.c 如何将其编译进内核&#xff1f; 在char目录下有Kconfig文件&#xff0c;其中有如下内容 tristate 表示该模块可以选择 Y N M(以.ko形…

【书生·浦语大模型实战营】第 2 节 -课后作业

第二节 -轻松玩转书生浦语大模型趣味 Demo-课后作业 0.课程体验0.1 鸡兔同笼0.2 逻辑推理0.3 AI会毁灭人类吗&#xff1f; 1.课后作业1.1 基础作业1.1.1 作业11.1.2 作业2 0.课程体验 课程链接&#xff1a;https://github.com/internLM/tutorial 首先&#xff0c;这个课程是免费…

javaWebssh网上超市销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh网上超市销售管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCA…

【笔记】React-Native React DevTools

/** * 官网文档&#xff1a;https://reactnative.dev/docs/next/react-devtools */ 1、本想在Demo项目中添加依赖(npx react-devtools)&#xff0c;但其他项目就需要再操作一次&#xff0c;所以全局安装就好了 yarn global add react-devtools 或 npm install -g react-devto…

Groovy

1 Groovy的诞生 Groovy是一门几经重生的语言&#xff0c;该语言由James Stracham和Bob McWhirter于2003年启动开发&#xff0c;之后于2004年3月成为JSR241&#xff08;Java Specification Request&#xff0c;即Java规范请求&#xff09;。不久因为存在一些困难和问题几近放弃。…

Java+SpringBoot+Vue自习室预约系统全栈开发

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Windows Docker 部署 SQL Server

部署 SQL Server 打开 Docker Desktop&#xff0c;切换到 Linux 容器。然后在 PowerShell 执行下面命令&#xff0c;即可启动一个 SQL Server 服务。这里安装的是 2022 年版本&#xff0c;如果需要安装其他或者最新版本&#xff0c;可以到 Microsoft Artifact Registry 进行查…

利用redis实现秒杀功能

6、秒杀优化 这个是 图灵 的redis实战里面的一个案例 6.1 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤…

ywtool工具默认功能

提示:工具下载链接在文章最后 目录 一.资源检查二.日志刷新三.工具升级四.linux运维工具ywtool介绍五.ywtool工具下载链接 一.资源检查 只要系统安装了ywtool工具,默认就会配置上"资源检查"的脚本资源检查脚本的执行时间:每天凌晨3点进行检查资源检查脚本的检查内容…

创业者的智选:知识付费小程序定制开发服务解析

探索知识付费领域的新时代&#xff0c;选择专业的知识付费小程序定制开发服务&#xff0c;打造个性化、高效的知识传播平台。无论您是企业、机构还是个体创作者&#xff0c;都能助您成功变现知识资产。 知识付费小程序的开发是一个涉及多方面技术的综合性工程。下面提供一些关…

开发知识点-Vlang

Vlang https://vlang.io/ Vlang 语言是一门新发布的静态类型语言&#xff0c;由 Alexander Medvednikov 发起&#xff0c;开源时间为2019年6月22日1。目前在 GitHub 上已有超过3万颗星&#xff0c;贡献者已有5百多人&#xff0c;快速迭代开发中2。Vlang 语言的设计目标是简单、…

OpenCV 4基础篇| OpenCV图像的拆分和合并

目录 1. 通道拆分1.1 cv2.split1.1.1 语法结构1.1.2 注意事项1.1.3 代码示例 1.2 NumPy切片1.2.1 代码示例 2. 通道合并2.1 cv2.merge2.1.1 语法结构2.1.2 注意事项2.1.3 代码示例 1. 通道拆分 1.1 cv2.split 1.1.1 语法结构 b,g,r cv2.split(img[, mv]) #图像拆分为 BGR 通…

《TCP/IP详解 卷一》第10章 UDP 和 IP 分片

目录 10.1 引言 10.2 UDP 头部 10.3 UDP校验和 10.4 例子 10.5 UDP 和 IPv6 10.6 UDP-Lite 10.7 IP分片 10.7.1 例子&#xff1a;IPV4 UDP分片 10.7.2 重组超时 10.8 采用UDP的路径MTU发现 10.9 IP分片和ARP/ND之间的交互 10.10 最大UDP数据报长度 10.11 UDP服务器…
最新文章