- 博客(45)
- 收藏
- 关注
原创 RK3588M平台写文件时断电问题处理
RK平台的文件系统类型是基于日志结构的(Journaling File System),这类文件系统,如ext4,XFS等,通过记录文件系统操作的日志来提高数据的一致性和恢复能力。在没有立即将文件元数据和内容写入磁盘的情况下,如果发生突然断电,由于缺乏日志记录来辅助未完成的操作,文件系统会“忘记”该文件的创建,导致文件在系统重启后“消失”。如果在这一过程中发生了断电,那么缓冲区的数据将会丢失。
2024-07-12 14:51:17 283
原创 RK3588 Android 12 系统内核开发+Native层脚本自启动+SELinux配置
开发板型号:RK_EVB7_RK3588_LP4…_V11目标:在开发板上随开机自启动脚本,带起二进制程序,并完备一些其他系统功能。简介:本文自启动脚本run.sh唯一的作用就是拉起二进制程序demo;demo是简单的hello_world程序,使用android-ndk-r18 toolchain编译而成。
2024-03-07 20:11:54 1798 1
原创 一文搞懂Qt-MQTT开发
本文内容涉及消息队列、MQTT基础知识,以及工程应用相关的服务器搭建、调试软件使用和代码示例。帮助读者一文搞清楚QT-MQTT开发所需的要点。
2022-09-09 16:18:53 20858 2
原创 Qt软件发布(版本信息,Release版程序,代码打包,制作安装包)
当我们完成了Qt程序的开发,希望交予测试,或是正式发布的时候,需要将我们的程序进行层层封装,最终以一个安装包的形式呈现给用户。专业版的软件发布,以Qt软件为例,需要三个步骤:生成版本信息,生成Release版程序,代码打包和制作安装包。本篇将分别对上述三个步骤展开描述。......
2022-08-17 15:17:36 6197
原创 Windows+MinGW使用CMake生成.dll动态链接库
在完成接口开发后,为了给其他开发人员调用,通常需要将这部分代码打包生成动态链接库文件。动态链接库很好地保证了代码的封装性和独立性,作为接口,它可以很好地独立于主程序,便于更新。调用接口的主程序编译时也会绕过已生成的动态链接库,仅作连接,在运行时使用它,减少了前端人员编译的时间消耗。......
2022-06-20 14:52:13 10750 1
原创 修复Qt程序长时间运行控件停止刷新
问题描述我的Qt程序有一个时间显示的功能,由于需要保持长期运行,这个时间控件就需要长期持续刷新。但是,当程序运行一段时间后,这个控件就似乎累了一样,不再继续刷新了。为了解决这个问题,我尝试过很多方法,包括:每隔一段时间,获取时间settext到控件上通过update(),repaint()等页面刷新方法使用qApp.processEvent()强制执行操作但是,无论怎么努力,都无法解决问题,我开始怀疑这是Qt的底层bug。与我遇到同样问题的人也有很多,下面这些都是例子。Qt长时间运行界面停
2022-05-10 15:42:43 2060 1
原创 使用openmp为循环逻辑提速
使用OpenMP为循环逻辑提速什么是OpenMP?OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套编译指令 (Compiler Directive)。OpenMP支持的编程语言包括C语言、C++和Fortran;而支持OpenMP的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的p
2022-05-06 08:50:34 788
原创 环境配置:Win10 - VSCode - MinGW64 - OpenCV 4.5.0 - ZBar 0.23.92
环境配置:Win10 - VSCode - MinGW64 - OpenCV 4.5.0 - ZBar 0.23.92前言1. VSCode下载VSCode安装 C/C++ 插件项目配置2. MinGW选择MinGW的原因MinGW下载开始安装安装MinGW配置环境变量安装后测试代码测试3. OpenCV安装CMakeOpenCV下载使用CMake编译OpenCV配置环境变量安装后测试4. ZBar下载ZBar编译ZBar安装后测试附注前言在开始环境配置前,请充分理解以下内容,减少配置中走回头路的概率。
2022-05-05 16:31:33 947
原创 通过几何关系判断二维码的朝向
序言在一些质量检测中,由于二维码不是直接打印上去的,而是由人工张贴,则有可能存在质量问题。需要对二维码的张贴是否为正向,以及是否贴偏进行自动检测。二维码的结构及基本原理有关二维码的结构和基本原理可以参考这一篇博客。 基于OpenCV实现二维码发现与定位简单来说就是通过二维码的三个定位框,可以确切地定位到一个二维码的位置。二维码的定位框的黑白区域面积比是确定的。设计思路在全图中搜索二维码的定位框。若定位框数量为3个,求出它们的质心坐标,进入下一步; 否则表明图中没有一个完整的二维码;通过三个
2022-04-25 14:33:56 1199
原创 修复ffmpeg写文件时的帧率异常问题记录
前言最近在一台部署运行了近一年的服务器上发现了一个问题,用户上传的视频文件,在经过一系列的处理后,使用moviepy写文件时,会消耗非常长的时间,同时还占满了CPU内存资源,使得其他请求无法处理。排查问题首先查看后台正在运行的命令,发现是ffmpeg正在处理视频,这是因为moviepy就是基于ffmpeg开发的python库,因此其中的视频处理操作的本质都是使用ffmpeg。通过log分析,处理是卡在了写文件这一步,程序没有报错返回,但由于写文件占满了全部的CPU资源,因此其他用户的请求也无法处理。
2022-04-25 13:47:58 3444
原创 Docker开发指南(自用)
Docker开发指南(自用)本指南总结归纳菜鸟教程上的常用指令,并在文末给出了一个应用实例。序言Docker是什么Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。Docker 从 17.03 版本
2022-04-24 18:25:20 2006
原创 [远程办公] 通过阿里云反向代理实现内网穿透
准备工作购买一台阿里云服务器,新用户第一个月免费。由于仅作数据转发用,配置要求不高,除了传输带宽外,其余配置选最低的就行。内网主机生成ssh密匙 ssh-keygen与远程主机建立免密登录ssh-copy-id root@ip安装依赖autossh后台运行命令如下:nohup autossh -M 监听端口 -NR *:映射出的端口号:localhost:本地端口号 用户名@公网ip &远程主机开放对所有端口访问ssh监听ufw disablevim /etc/ssh/ssh
2022-03-07 10:29:20 1093
原创 Qt自定义滑动条
最近要用到滑动条,Qt自带的QSlider虽然能满足需求,但是操作起来有很多不舒服的地方,于是在它的基础上改了改,分享给大家使用。先放效果图:在QSlider的基础上,改变了样式,绘制了刻度,增加了取整功能,只需要微调就能适应各种需求。头文件。需要包含下面的东西#include <QSlider>#include <QtCore>#include <QStylePainter>#include <QStyleOptionSlider>
2022-01-14 14:26:48 4795 1
原创 Qt之QMake编译转换为CMake编译
一、前言QMake和CMake都是用来控制编译过程的构建系统,最终生成可在选择的编译器环境中使用的本机makefile和工作区。简单来说,QMake和CMake就像类似于作曲,makefile类似于乐谱,最终由编译器完成乐章的演奏。那么QMake和CMake有什么区别呢?对于纯Qt项目,QMake更加好用。QMake与QtCreator的相性很好,通过.pro文件指导Qt工程编译,方便又快捷。但是,如果需要对Qt以外的第三方依赖项进行配置检查,比如一个很大的项目,其中除了Qt的部分子工程外,还有其他
2021-12-22 10:36:23 10378 1
原创 Qt给静态屏保加上粒子特效
最近正在开发一个系统,有时我觉得常用的静态屏保页面太单调了,想加入一些动态的要素。然后就发现了Qt有一个粒子特效的系统,但是需要用到Qml,而我的系统是用QWidget开发的,没办法直接用Qml…但是Qt也想到了这一点,官方提供了一个叫做quickwidgets的模块,通过它就可以在QWidgets里嵌入动态的Qml页面。基于此,我们开始逐步改写。一、添加quickwidgets模块QT += quickwidgets二、编写qml页面这里采用的方案是在qml中显示原来的静态图片,
2021-12-22 09:31:08 713
原创 gitlab项目代码仓库管理指南(自用)
gitlab项目管理流程任何项目开始即创建对应项目仓库;issues应覆盖项目从原始需求->项目结题过程中各环节,记录问题、解决思路等;及时整理,及时归档;流程图git常用命令图创建项目团队注意事项正式项目应所属团队,对于新项目,先创建团队,再创建项目;团队名遵循首字母大写,_连接的方式;为便于管理,创建团队时,请在Develop_group_5下创建子团队(需要Maintainer权限);无创建子团队权限的情况下,可以先新建团队和项目,并将科室代码管理人员添
2021-12-09 10:36:58 5630
原创 使用京东FaceX-Zoo sdk生成戴口罩数据集
使用京东FaceX-Zoo sdk生成戴口罩数据集最近要做戴口罩的人脸识别,事实上当前开源的模型都不那么尽如人意,所以要优化算法再重新训练。首先要解决的就是数据集的问题。因为从网络中能获取到的真实戴口罩人脸图像比较少,因此需要想办法生成一些戴口罩的人脸数据。这里推荐京东开源的FaceX-Zoo框架(https://gitee.com/yangdashi/FaceX-Zoo/tree/main#/yangdashi/FaceX-Zoo/blob/main/addition_module/face_mask
2021-11-17 09:08:54 3802 3
转载 在QT中使用日志系统
文章转载自 https://blog.csdn.net/hl1796/article/details/90205218当写好的软件发布出去后,用户遇到死机或一些其他的bug,我们该怎么追踪这些问题呢,这时候日志系统很好的帮助了我们。*我在原作者的基础上增加了日志输出模式的区分,开发阶段需要看到所有日志,而发布版只需要看错误日志就行了,所以在这里加以分别。#define compileMode 1 //控制日志的输出模式: 1.debug; 2.releasevoid outputMessage(Q
2021-10-18 15:08:30 515
原创 shell实现嵌入式软件看门狗
shell实现嵌入式软件看门狗长时间运行的嵌入式程序,有时会因为莫名其妙的原因挂掉,这时就需要有其他的程序来一直监控我们的程序。由于监控程序属于软件层面,因此这种程序被称为“软件看门狗”。这里用一个shell脚本实现该功能,这个脚本会一直监控后台的名为“XXX”的程序,如果程序挂掉,就会重启设备。设备启动时,会自动开启程序和这个脚本。代码如下:#!/bin/shwhile :do stillRunning=$(ps |grep "XXX" |grep -v "grep") if [ "$s
2021-10-11 14:01:30 370
原创 Debug的好帮手,C/C++神奇的编译选项
Debug的好帮手,C/C++神奇的编译选项嵌入式代码的debug一直是一个比较麻烦的问题,这些代码通常无法在本地PC调试,而在开发板上显示的错误有时又太过简单(例如经典的Segmentation Fault和Bus Error),无法追溯到错误的具体位置,有时甚至都不会报错,程序就莫名其妙的中断了。这里提供一个非常好用的解决办法,就是在你的编译选项中加入下列内容:-fsanitize=address -fno-omit-frame-pointer加入后,原本的CMake就变成了下面的样子。#
2021-10-11 10:41:10 485
原创 Qt使用socket单端口监听多台设备策略
Qt使用socket单端口监听多台设备策略项目背景:客户端设备启动后便会一直向指定ip和端口下发送信息,每次发送的时间间隔1秒,发送的内容包括设备的配置内容。服务端要求编写代码,通过socket与多台客户端设备建立长连接,持续地获取客户端发送的消息,分别解析它们然后在前端显示。此外,服务端设备还需要可以选择设备定向发送命令,从而操控该设备。项目环境:Linux系统 + Qt前、后端 + sqlite数据库解决思路:因为需要连接到多台设备,因此需要使用多线程,每个子线程分别处理一台客户端设备发送的内容。
2021-07-29 11:15:44 1757
原创 Linux解决“No space left on device“问题
维护一个后台运行的程序时,突然报了"No space left on device"的错。因为程序需要一直向磁盘写入图片文件,因此第一反应怀疑是不是图片太多导致磁盘空间不足?但事实并不是这样。通过命令df -h查看磁盘占用率发现用量并没有满。接着自然联想到是不是图片数量太多了,超过了系统最大的文件范围?通过命令df -i看到这条假设也是不对的。带着疑问在网上搜索答案,发现了这篇文章:https://blog.merovius.de/2013/10/20/ext4-mysterious-no-sp
2021-06-15 15:37:33 646 1
原创 Qt之使用socket实现远程控制
Qt之使用socket实现远程控制在前面的文章中介绍过Qt心跳包的实现方法,本篇文章将会介绍下位机通过心跳包和上位机之间进行数据交互和远程功能控制的实现方法。首先介绍环境,下位机使用Qt作为主程序,上下位机使用TCP socket进行网络通信,上位机实现方式任意。下位机心跳包线程在进程一开始就启动,一直到进程结束才停止。心跳包是一个始终独立的线程,首先要搭建框架:main.cpp#include <heartbeatthread.h> //心跳包线程 heartbea
2021-04-30 14:35:45 2472 3
原创 Qt文本的淡入淡出
Qt文本的淡入淡出对于写在Qlabel中的文本,想对其实现淡入和淡出的特效,需要用到QGraphicsOpacityEffect,并搭配计时器使用。示例如下。.h文件:#include <QGraphicsOpacityEffect>#include <QTImer>QTimer *opacity_timer = nullptr;QGraphicsOpacityEffect *effect = nullptr;QLabel *meet = nullptr;flo
2021-04-22 16:52:21 855
原创 Qt之TCP心跳包
Qt之TCP心跳包当Qt作为客户端程序,而服务器需要监控客户端的在线状态时,就需要Qt端发送心跳包。心跳包可以是TCP也可以是UDP,这里介绍TCP心跳包的实现方法。心跳包通常要单开一个线程,在进程运行的过程中一直执行。代码示例:.h文件#ifndef HEARTBEATTHREAD_H#define HEARTBEATTHREAD_H#include <QThread>#include <QCoreApplication>#include <QTimer&
2021-04-13 11:47:27 4511 4
原创 Qt多线程的几种实现方式
Qt多线程的几种实现方式在Qt中经常会遇到耗时操作,需要并发执行,这个时候就要用到多线程。Qt的多线程有多种实现形式,这里介绍3种方式。类实现形式用类实现多线程是最传统的实现形式,思想是写一个继承QThread的类,然后通过run()来开启线程。代码示例:.h文件#include <QThread>class xthread : public QThread{ Q_OBJECTpublic: explicit xthread(QObject *paren
2021-04-13 11:29:08 5578
原创 算法开发API,打包docker并发布
算法开发API,打包docker并发布项目需求如下:已完成训练的模型,开发为可供调用的接口服务。创建Dockerfile,将模型打包为docker容器镜像。将docker容器镜像推送至Harbor。开发API首先获取到开源的python代码,下载训练好的模型,在本地配置好运行环境,测试是否满足需要。也可以根据需求用自己的数据集训练。测试成功后,简化代码,删减不需要的代码(如训练和验证代码)。然后将demo代码通过fastapi封装为HTTP接口服务。首先需要添加依赖pip instal
2021-03-22 10:22:03 3420
原创 Qt简单的异步操作实现方法
Qt简单的异步操作实现方法在实际应用中,经常会遇到一些耗时操作,导致了主线程的阻塞,这时候可以使用异步操作来避免阻塞。Qt的异步操作需要使用下面的库#include <QtConcurrent/QtConcurrent>然后将耗时操作丢进下面的函数中即可。QtConcurrent::run([=]() { func(); });如果需要判断耗时操作执行完毕与否,可以使用QFuture和QFutureWatcher的结合。QFuture 表示异步计算
2021-03-03 08:46:29 6477
原创 Qt解决Linux/ARM下QSound无法播放的问题
Qt解决Linux/ARM下QSound无法播放的问题Qt在Linux/ARM环境下使用QSound播放音频时,有时会遇到音频无法播放的问题。这有可能是音频文件与Qt不兼容的问题。QSound只能播放.wav格式的音频,无法播放诸如.mp3格式的音频。但即使是.wav格式的音频,也存在 NIST/Sphere和Microsoft WAVE类型的区别。注意!Qt只支持Microsoft WAVE的.wav格式音频,不支持NIST/Sphere的。 因此当你怀疑你的.wav音频格式时,建议使用文件转换器将
2021-02-20 15:50:10 1922 1
原创 Qt自动同步时间
Qt自动同步时间Qt自动同步时间需要使用网络时间协议(Network Time Protoco, NTP)。首先需要include一个NTP的库#include <QUdpSocket>然后在头文件声明signals: void connected(); void readyRead();public slots: void setNtp(); void connectsucess(); void readingDataGrams();
2021-02-06 16:00:37 2246 6
原创 Qt之WIFI搜索、显示与连接
首先介绍一下我的环境,Linux环境下使用Qt,交叉编译到ARM板上调试,ARM板自带WIFI模块,大部分Linux命令我都可以自由地使用。首先,需要通过控制台命令来获取WIFI信息,按照图片上画的,至少要得到WIFI名称、信号强度和加密方式。获取WIFI的命令有很多,但是简单地调用命令获取WIFI信息文件无法直接使用,还需要提取到其中的字符串信息。假定我们通过一些命令,获取到了这些内容,还要通过代码将它们传递给主程序。做到这一点,前期的准备工作才算做完。
2021-01-26 17:31:02 9126 2
原创 ARM上搜索WIFI并解析字符串
ARM上搜索WIFI并解析字符串背景:项目部署在ARM上,现要实现软件层面的WIFI模块,需要在Qt上通过system指令搜索wifi并解析字符串。方案1:Qt可以使用system命令,使用iwlist指令并配合grep和sed指令将搜索结果过滤为我们想要的格式,即下面这样的格式:wifi名wifi信号强度wifi加密模式...最后Qt通过readLine()的方式逐行读取文件中的内容。代码如下:system("sudo iwlist wlan0 scan >./temp ");
2021-01-25 11:51:30 1989 8
原创 Qt之点击QLineEdit显示软键盘
点击QLineEdit显示软键盘在嵌入式开发时,不能通过鼠标键盘输入是很常见的。这时候就需要通过软件层,实现软键盘和输入法来满足用户需求。一般来说,软键盘的显示通常和QLineEdit的点击事件挂钩。而QLineEdit与QPushButton不同,它并没有clicked的信号,因此需要通过别的方式来监测点击事件。因此,点击QLineEdit显示软键盘可以解耦为两个问题:1)软键盘+输入法; 2)软键盘触发。1)软键盘+输入法一般来说不推荐造轮子,软键盘目前有大量的开源项目,这里推荐这篇博文。(后
2021-01-13 15:58:06 6963 4
原创 数据集批量打标——shell脚本批量生成文件并重命名
shell脚本批量生成文件并重命名最近接到一个数据集标注的任务,使用的标注工具是LabelImg。使用前配置了环境Anaconda python=3.7 Linux,并在该环境下配置了pyqt5。数据集里的图片是一段视频逐帧抽图,要求在图片中用方框框出要找的物体。由于是逐帧抽取,且要找的物体在很多图片中没有发生位置变化,因此在标注过程中希望写一个脚本进行批量处理。LabelImg YOLO模式下每标记完一张图片,都会在指定位置生成一个相同名称的txt文件,记录了类别和位置信息(左上角和右下角的坐标)。
2021-01-07 09:09:28 806
原创 Qt使用数组实现控件批处理
Qt使用数组实现控件批处理在Qt中,当你需要对多个控件进行批处理操作时,使用控件数组会大大简化你的代码量。例如希望在一个页面中创建一个控件数组,其中包含8条控件集合。控件数组的定义如下:QCheckBox *checkbox[8];QLabel *name[8];QLabel *ID[8];QPushButton *userDelBtn[8];QPushButton *userEdtBtn[8];然后在你的cpp中使用循环,将它们实例化。for(int i = 0; i < 8;
2020-12-28 18:01:36 4888 3
原创 Qt简单的按钮槽函数传递参数方法
Qt简单的按钮槽函数传递参数方法Qt中一个典型的点击按钮触发槽函数的写法是:connect(btn, &QPushButton::clicked, this, &class::func);当你希望在点击按钮后再向槽函数中传递参数,这种写法就无法做到了。其原因是槽函数要和信号的参数完全对应,如果修改了传给槽函数的参数,点击按钮的信号就无法处理。这里给出一个比较简单的传参方法,在信号槽中使用lambda表达式,如:connect(btn, &QPushButton::clic
2020-12-28 17:51:31 10457 3
原创 Qt启动页多线程
Qt启动页多线程项目需要在Qt进入启动页之前加载一个大模型文件,同时要有一个页面用来提示用户加载状态。这里就需要用到多线程了,如果在单线程操作,要么需要等到文件加载完毕后才能显示等待页,要么干脆跳过了模型文件的加载,都是不符合需求的。我们通过代码分析。首先要绘制加载页,这里做一个非常简单的等待页,只有一行Loading…,可根据需求修改。waiting.h#ifndef WAITING_H#define WAITING_H#include <QDialog>#include
2020-12-03 15:11:07 453
原创 Qt使用OpenCV调用摄像头显示到QLabel并裁剪
Qt使用OpenCV调用摄像头并裁剪在Qt中调用摄像头并显示在界面中,有两种方式。第一种方式可以使用Qt自带的QCamera库,并在你的.pro文件中加入如下代码。QT += multimediaQT += multimediawidgets这种方式虽然简单,但在嵌入式开发中配置环境很容易带来麻烦。而且这种方式无法使摄像头采集的图像完美适配各种自定义的分辨率(在网上找了很久也没找到,如果可以请指教)。采用OpenCV则可以较好地实现这一要求,但使用前要先配好OpenCV的
2020-11-23 09:03:17 1364
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人