Qt+大恒相机回调图片刷新使用方式
一、前言
上篇文章介绍了如何调用大恒SDK获得回调图片,这篇介绍如何使用这些图片并刷新到界面上。考虑到相机的帧率很高,比如200fps是很高的回调频率。那么我们的刷新频率是做不到这么快,也没必要这么快。一般刷新在60帧左右就够了。
二、思路
1,回调函数采用Qqueue队列的方式储存图片
2,主函数设置定时器QTimer,间隔20ms从队列拿去到一张图片刷新到界面上去,注意利用异步的方式执行耗时的操作,在完成格式转化后,再传给UI现场刷新界面,否则会造成界面卡顿。
3,注意对队列使用QMutex,避免资源冲突。
三、部分代码
① 回调函数将相机的原始数据转换为cv::Mat,并调用writeImageQueue(capturedImg),存入队列。因为队列是先入先出,所以队列超过4后,需要先出队,然后再入队,保证图片更新最近的几张。
void Class_CaptureEventHandler::DoOnImageCaptured(CImageDataPointer & objImageDataPointer, void* pUserParam)
{if (GX_FRAME_STATUS_SUCCESS == objImageDataPointer->GetStatus()){//图像获取为完整帧,可以读取图像宽、高、数据格式等uint64_t ui64Width = objImageDataPointer->GetWidth();uint64_t ui64Height = objImageDataPointer->GetHeight();GX_PIXEL_FORMAT_ENTRY emPixelFormat =objImageDataPointer->GetPixelFormat();uchar* pbit = (uchar*)objImageDataPointer->GetBuffer();void* pRGB24Buffer = NULL;cv::Mat capturedImg;//原始数据是 Mono8 图像if (objImageDataPointer->GetPixelFormat() == GX_PIXEL_FORMAT_MONO8){pRGB24Buffer = objImageDataPointer->ConvertToRaw8(GX_BIT_0_7);capturedImg = cv::Mat::zeros(cv::Size(ui64Width, ui64Height), CV_8UC1);memcpy(capturedImg.data, pRGB24Buffer, ui64Width * ui64Height);}if (objImageDataPointer->GetPixelFormat() == GX_PIXEL_FORMAT_MONO10){pRGB24Buffer = objImageDataPointer->ConvertToRGB24(GX_BIT_2_9, GX_RAW2RGB_NEIGHBOUR, true);capturedImg = cv::Mat::zeros(cv::Size(ui64Width, ui64Height), CV_8UC3);memcpy(capturedImg.data, pRGB24Buffer, ui64Width * ui64Height * 3);}writeImageQueue(capturedImg);}
}void Class_CaptureEventHandler::writeImageQueue(cv::Mat mat_Image)
{mutex.lock();if (CameraImage_queue.count() > 4){CameraImage_queue.dequeue();}CameraImage_queue.enqueue(mat_Image);mutex.unlock();
}
② 主函数设置定时器QTimer,间隔20ms从队列拿去到一张图片刷新到界面上去,QFutureWatcher和QFuture组合利用,可以完成异步处理长耗时的图片处理,然后将处理好的图片刷新到界面上,避免界面卡顿。
void CameraConfig::do_timeForUpdateView()
{QFutureWatcher<QImage>* watcher = new QFutureWatcher<QImage>(this);connect(watcher, &QFutureWatcher<QImage>::finished, this, [this, watcher]() {QImage result = watcher->result(); // 获取结果if (!result.isNull()){graphicsView_Camera->displayImage(result);}watcher->deleteLater(); // 清理 watcher});QFuture<QImage> future = QtConcurrent::run([this]()->QImage {cv::Mat tempMat= dynamic_cast<Class_CaptureEventHandler*>(pCaptureEventHandler)->readImageQueue();QImage Image;if (!tempMat.empty()){Image=Mat2QImage(tempMat);}return Image;});watcher->setFuture(future);
}
③ 从队列中拿去可用的图片,可以使用tryLock方式,如果10ms内没能拿到就不等了
cv::Mat Class_CaptureEventHandler::readImageQueue()
{cv::Mat readImage;if(mutex.tryLock(10)){if (CameraImage_queue.count() > 0){readImage = CameraImage_queue.dequeue();} mutex.unlock();}return readImage;
}
四、效果展示

相关文章:
Qt+大恒相机回调图片刷新使用方式
一、前言 上篇文章介绍了如何调用大恒SDK获得回调图片,这篇介绍如何使用这些图片并刷新到界面上。考虑到相机的帧率很高,比如200fps是很高的回调频率。那么我们的刷新频率是做不到这么快,也没必要这么快。一般刷新在60帧左右就够了。 二、思路…...
Docker 环境下 PostgreSQL 监控实战:从 Exporter 到 Prometheus 的部署详解
Docker 环境下 PostgreSQL 监控实战:从 Exporter 到 Prometheus 的部署详解 文章目录 Docker 环境下 PostgreSQL 监控实战:从 Exporter 到 Prometheus 的部署详解一 节点简述二 节点监控部署1)创建 PostgreSQL 的 exporter 账号2)…...
构建带有调试符号的srsRAN 4G
### 构建带有调试符号 首先确保已下载srsRAN 4G,并已创建并导航至构建文件夹: bash git clone https://github.com/srsran/srsran_4g.git cd srsRAN_4G mkdir build cd build 若srsRAN 4G已构建完成,应清除原有构建文件夹后继续。 可以使…...
算法题总结(十)——二叉树上
#二叉树的递归遍历 // 前序遍历递归LC144_二叉树的前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result new ArrayList<Integer>(); //也可以把result 作为全局变量,只需要一个函数即可。…...
【MySQL】MySQL 数据库主从复制详解
目录 1. 基本概念1.1 主从架构1.2 复制类型 2. 工作原理2.1 复制过程2.2 主要组件 3. 配置步骤3.1 准备工作3.2 在主服务器上配置3.3 在从服务器上配置 4. 监控和维护4.1 监控复制状态4.2 处理复制延迟4.3 故障恢复 5. 备份策略5.1 逻辑备份与物理备份5.2 增量备份 6. 使用场景…...
一种格式化printf hex 数据的方法
格式化输出HEX数据 调试过程中通常需要个格式化输出16进制数据,为了方便美观可以参考如下方法。 #define __is_print(ch) ((unsigned int)((ch) - ) < 127u - )/*** dump_hex* * brief hex打印* * param buf: 需要打印的原始数据* param size: 原始数据类型*…...
在LabVIEW中如何读取EXCEL
在LabVIEW中读取Excel文件通常使用“报告生成工具包”(Report Generation Toolkit)。以下是详细步骤: 安装工具包:确保已安装“报告生成工具包”。这通常随LabVIEW一起提供,但需要单独安装。 创建VI: 打…...
布匹瑕疵检测数据集 4类 2800张 布料缺陷 带标注 voc yolo
布匹瑕疵检测数据集 4类 2800张 布料缺陷 带标注 voc yolo 对应标注,格式VOC (XML),选配Y0L0(TXT) label| pic_ num| box_ _num hole: (425, 481) suspension_ wire: (1739, 1782) topbasi: (46, 46) dirty: (613&…...
灵动微高集成度电机MCU单片机
由于锂电技术的持续进步、消费者需求的演变、工具种类的革新以及应用领域的扩展,电动工具行业正呈现出无绳化、锂电化、大功率化、小型化、智能化和一机多能化的发展趋势。无绳化和锂电化的电动工具因其便携性和高效能的特性,已成为市场增长的重要驱动力…...
陪护小程序|护理陪护系统|陪护小程序成品
智能化,作为智慧医疗宏伟蓝图的基石,正引领着一场医疗服务的深刻变革。在这场变革的浪潮中,智慧医院小程序犹如璀璨新星,迅速崛起,而陪护小程序的诞生,更是如春风化雨,细腻地触及了老年病患、家…...
【JVM】基础篇
1 初识JVM 1.1 什么是JVM JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 Java源代码执行流程如下: 分为三个步骤: 1、编写Java源代码文件。 …...
软件测试工程师 朝哪里进阶?
软件测试工程师 朝哪里进阶? 这里浅谈一下我的看法。 软件测试工程师 朝哪里进阶呢? 当我们测试工程师工作了2-3年后,就需要往前走往高走,就像一句名言说的:我们需要像ceo一样工作。 将自己的边界扩大一点࿰…...
Obsidian Plugin Release Pre-check
- [ ] 修改代码 - [ ] 修改README.md - [ ] 修改manifest.json - [ ] --将上述修改push到GitHub-- - [ ] 修改release版本 git tag git tag -a 1.0.6 -m "1.0.6" git push origin 1.0.6 ------------------------------------------- 备忘https://semver.org/lang/…...
Unity中实现预制体自动巡逻与攻击敌人的完整实现指南
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
OpenJudge | Shortest Prefixes
总时间限制: 1000ms 内存限制: 65536kB 描述 A prefix of a string is a substring starting at the beginning of the given string. The prefixes of “carbon” are: “c”, “ca”, “car”, “carb”, “carbo”, and “carbon”. Note that the empty string is not co…...
速盾:高防服务器是如何防御CC攻击的?
高防服务器是一种专门用于防御DDoS(分布式拒绝服务)攻击的服务器。其中一种常见的DDoS攻击就是CC(连续性攻击),它通过向目标服务器发送大量的请求来耗尽服务器资源,使网站无法正常运行。高防服务器采用多种…...
Android阶段学习思维导图
前言 记录下自己做的一个对Android原生应用层的思维导图,方便个人记忆扩展;这里只露出二级标题。 后语 虽然有些内容只是初步了解,但还是记录了下来;算是对过去一段学习的告别。...
React生命周期案例详解
React 组件的生命周期是指组件从创建、渲染、更新到卸载的整个过程。在 React 16 及之前的版本中,生命周期方法被分为几个不同的阶段:挂载(Mounting)、更新(Updating)、卸载(Unmounting…...
【ubuntu】ubuntu20.04安装显卡驱动
1.安装 点击右下角Apply Changes。 等安装好之后,重启。 现在的nvidia驱动已经很好安装了,比早期时安装出现黑屏等情况好了很多。 2.验证 nvidia-smi...
Mongo Java Driver使用getCollection做分页查询遇到的一些坑
背景 最近在做Mongo上的表数据的迁移,原本应该是DBA要干的活,但是想着DBA排期比较长,加上我们开发的权限又非常有限,而且数据量又没有多少,就想着自己开发个小小的程序从旧实例上查,写到新实例上去算了。于…...
终极R3nzSkin换肤工具:英雄联盟国服免费皮肤自定义完整指南
终极R3nzSkin换肤工具:英雄联盟国服免费皮肤自定义完整指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 你是否曾经羡慕别人拥有稀有皮肤…...
SLCAN协议实战:从脚本编写到自动化测试全解析
1. SLCAN协议基础:嵌入式开发者的文本化CAN接口 第一次接触SLCAN协议时,我正为一个汽车电子项目头疼——需要快速验证CAN总线设备却找不到合适的调试工具。直到发现抽屉里吃灰的LAWICEL CANUSB适配器,这个基于SLCAN协议的小玩意彻底改变了我…...
从静态分析到代码自愈:构建自动化自我审查工具提升代码质量
1. 项目概述:从“自我审视”到“代码自愈”的工程实践在软件开发的日常中,我们常常会陷入一种“当局者迷”的困境:自己写的代码,怎么看都觉得逻辑清晰、结构完美,但一旦交给同事评审或者上线运行,各种潜在的…...
Claude代码生成Token预算管理实战:成本控制与智能优化策略
1. 项目概述与核心价值最近在折腾大模型应用开发,特别是围绕Claude这类顶尖的代码生成模型时,一个绕不开的痛点就是成本控制。模型调用是按Token计费的,而一个复杂的代码生成任务,动辄消耗成千上万个Token,账单不知不觉…...
Taotoken用量看板如何帮助开发者洞察API消费明细
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken用量看板如何帮助开发者洞察API消费明细 对于依赖大模型API进行开发的团队或个人而言,清晰、透明地掌握资源消…...
如何在华硕路由器上3分钟安装AdGuardHome实现全网广告拦截
如何在华硕路由器上3分钟安装AdGuardHome实现全网广告拦截 【免费下载链接】Asuswrt-Merlin-AdGuardHome-Installer The Official Installer of AdGuardHome for Asuswrt-Merlin 项目地址: https://gitcode.com/gh_mirrors/as/Asuswrt-Merlin-AdGuardHome-Installer 厌倦…...
告别3389端口暴露:零信任防火墙重塑RDP安全访问新范式
1. 传统RDP安全方案的致命短板 每次看到服务器日志里那些密密麻麻的暴力破解尝试记录,我的后颈都会发凉。作为从业十年的运维老兵,我见过太多因为3389端口暴露引发的安全事故。有个客户的数据库服务器,明明设置了16位复杂密码,还是…...
手把手教你用MPU6050和nRF52832做手环计步:避开数据读取卡死的坑
手把手教你用MPU6050和nRF52832实现稳定计步:从硬件调试到算法优化全攻略 在可穿戴设备开发中,计步功能看似基础却暗藏玄机。许多开发者在使用MPU6050加速度传感器搭配nRF52832主控时,都会遇到一个令人头疼的问题——系统运行一段时间后莫名卡…...
技能同步工具:跨平台开发环境配置自动化管理方案
1. 项目概述:技能同步,一个被低估的开发者效率工具如果你和我一样,每天需要在多台电脑(比如公司的台式机、家里的笔记本、甚至偶尔应急的平板)之间切换,并且每台设备上都配置了不同的开发环境、安装了不同的…...
Adafruit Bluefruit Playground:iOS与蓝牙开发板的物联网交互实战
1. 项目概述与核心价值 如果你手头有一块Adafruit的Circuit Playground Bluefruit或者CLUE开发板,想让它在你的iPhone或iPad上“活”起来,变成一个能远程控制彩灯、读取传感器数据甚至演奏音乐的智能玩具,那么Adafruit Bluefruit Playground …...
