自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(63)
  • 收藏
  • 关注

原创 机器视觉halcon学习笔记(一)

首先明确图像是什么,图像分为数字图像和模拟图像。

2026-08-17 16:10:52 394

原创 C++排序算法学习笔记

本文对比分析了C++中三种基础排序算法:快速排序、堆排序和插入排序。首先介绍了排序算法的评价标准,包括时间复杂度、稳定性(保持相同元素相对位置)和原地性(是否需额外空间)。随后详细讲解了冒泡排序(稳定、O(n²))、选择排序(不稳定、O(n²))和插入排序(稳定、最优O(n))的实现原理、代码示例及其特性。特别强调了STL的std::sort采用Introsort策略,综合了这三种算法的优势。通过代码演示和复杂度分析,揭示了不同算法在时间效率、空间占用和稳定性上的差异,为算法选择提供了理论依据。

2025-08-19 22:54:51 1227

原创 ModbusTCP学习笔记(QModbus实例)

Modbus是一种工业通信协议,用于主从设备间数据交换。它支持RS-232/485和TCP/IP接口,采用轻量级报文结构,分为线圈(布尔值)和寄存器(非布尔值)两类存储区,各分读写区域。ModbusTCP报文由MBAP头和PDU数据组成,包含事务标识、协议标识、长度和单元标识等字段。典型操作包括读取/写入线圈和寄存器状态值,如读取输出线圈地址00020-00046或保持寄存器40108-40109。协议通过功能码区分操作类型,响应报文返回数据或异常码,适用于PLC、传感器等设备通信。

2025-08-19 22:54:07 1270

原创 Qt插件学习笔记

本文介绍了Qt插件开发的核心流程和应用场景。首先阐述了插件机制的特点:插件依赖应用程序运行,但应用程序可独立运作,支持热插拔和动态更新。文章对比了插件与动态库的区别,指出插件通过接口编程实现松耦合,无需lib文件支持。详细讲解了Qt插件开发的四个关键步骤:定义通信接口、使用Q_DECLARE_INTERFACE宏声明接口、QPluginLoader加载插件以及接口测试方法。通过一个减法功能的示例,展示了主程序如何定义接口(DeclareInterface)并加载插件,以及插件项目如何实现接口(QTPlugi

2025-08-12 16:35:53 1199

原创 C++右值引用学习笔记

本文摘要: C++11引入右值引用和移动语义,通过区分左值/右值实现资源高效管理。右值(临时对象)具有短生命周期、不可取地址等特性,分为纯右值和将亡值。移动语义利用右值引用"窃取"资源而非深拷贝,显著提升性能,适用于大对象传递、资源管理等场景。完美转发则通过std::forward保持参数原始值类别,解决泛型编程中的参数传递问题。两者共同构成了现代C++高效资源管理的基础,开发者应掌握值类别判断、移动构造/赋值实现等关键技术要点。

2025-08-12 16:34:30 1290

原创 Qt事件系统学习笔记

本文介绍了Qt事件处理机制的核心流程和实现方法。事件从生成到生效需要经历多个环节:首先通过QCoreApplication::notify()投递,然后可能被事件过滤器拦截;未被拦截的事件会进入目标部件的event()函数进行分发,并调用对应的具体事件处理函数(如mousePressEvent)。文章通过自定义MyLineEdit类示例,演示了键盘事件的完整传递链条:事件过滤器→event()→keyPressEvent()→父部件处理。其中,accept()/ignore()方法控制事件是否继续冒泡。事件

2025-08-05 17:58:34 867

原创 VS2019c++环境下OPCUA+Kepserver+open62541实现与三菱plc通信

KepServerEx是一款功能强大的工业数据采集软件,支持多种驱动协议,可用于OPC服务器搭建。文章详细介绍了其数据模拟功能的配置方法,包括斜坡、随机、正弦等函数的使用。同时提供了KepServer的OPC UA服务器配置步骤,以及如何通过Quick Client查看实时数据。此外,还介绍了开源OPC UA库open62541的使用方法,涵盖环境搭建、最小服务器/客户端实现、多节点订阅等核心功能,并提供了可直接运行的代码示例。两种方案均可用于工业自动化场景下的数据采集与通信测试。

2025-08-05 17:56:39 1710

原创 C++ STL中迭代器学习笔记

摘要: STL迭代器本质是封装指针行为的对象,通过重载运算符实现容器的统一遍历。STL将迭代器分为五类(输入、输出、前向、双向、随机访问),通过iterator_traits技术动态提取类型信息,利用标签分发(如input_iterator_tag)为不同迭代器选择最优算法(如advance的O(1)或O(n)实现)。迭代器适配器(如反向迭代器、插入迭代器)扩展了功能,而__normal_iterator则是对原生指针的封装,保持接口统一。理解迭代器机制是掌握STL泛型编程的核心,涉及模板、类型萃取和标签分

2025-07-20 21:36:06 1120

原创 C++ 并发 future, promise和async

本文系统介绍了同步与异步编程的核心概念及C++11中的异步编程工具。同步编程按顺序执行任务并阻塞当前线程,而异步编程允许任务并发执行并通过回调、Promise等方式通知结果。文章重点讲解了C++11中的异步编程组件:std::async用于异步执行函数并返回future对象,支持不同的启动策略;std::promise/future机制则实现了线程间值或异常的传递。最后通过代码示例展示了这些工具的使用方法,并指出了promise生命周期管理的重要性。这些工具为C++开发者提供了强大的异步编程能力,能有效提升

2025-07-20 21:09:40 1024

原创 ProtoBuf学习笔记

文章摘要: Protobuf是Google开发的跨平台、高效的数据序列化工具,支持多种编程语言。文章详细介绍了Windows平台下使用VS2019编译和配置Protobuf库的步骤,包括源码下载、CMake编译、环境变量设置及VS项目集成。通过示例展示了如何定义.proto文件并生成C++类,实现数据的序列化与反序列化。此外,还探讨了Protobuf在网络通信中的应用,包括消息定义和数据解析。全文提供了从安装到实际开发的完整流程,适合开发者快速上手Protobuf。

2025-07-07 15:47:49 1061

原创 CPP线程池设计与分析实现

本文探讨了并发与并行的区别、多线程应用场景及线程池实现。并发指单核CPU通过时间片轮转模拟多线程执行,而并行是多核/多CPU真正同时执行线程。多线程适用性取决于程序类型:单核CPU中IO密集型程序适合多线程,CPU密集型则因上下文切换开销而不适合;多核CPU中并行可提升利用率。线程池通过预先创建线程减少创建销毁开销,分为固定数量(fixed)和动态增长(cached)两种模式。线程同步涉及互斥锁(mutex)和条件变量(condition_variable)实现线程安全。最后通过生产者消费者模型和信号量机制

2025-07-07 15:46:51 926

原创 字节序与TCP粘包问题处理分析

TCP作为流式传输协议,数据包边界不明确可能导致"粘包"问题。本文分析了粘包现象的成因,主要包括发送缓冲区延迟发送和接收端处理不及时两种情况。针对此问题,文章提出了三种解决方案:使用标准应用层协议、尾部添加特殊字符分隔、以及添加固定大小的数据头。其中数据头方案最为实用,通过在数据块前添加包含包长度的数据头,接收端可准确拆包。文章详细介绍了基于Qt的封包拆包实现方法,包括QDataStream的用法和缓冲区处理逻辑,并强调了残留数据与下一包组合的必要性。最后指出,TCP粘包并非协议缺陷,而是程序设计需解决的问

2025-06-18 22:21:45 674

原创 QTableView为例:Qt模型视图委托(MVD)(Model-View-Delegate)

QT中的MVD(模型-视图-委托)模式是一种类似于MVC的设计模式,将数据、界面和交互逻辑分离。模型负责数据管理,视图负责显示界面,而委托则嵌入在视图中处理数据的显示和编辑。QT提供了多种视图组件(如QListView、QTreeView、QTableView)和模型类(如QStandardItemModel、QAbstractItemModel),支持数据的多样化呈现。委托(Delegate)通过定制显示和编辑行为增强了视图的灵活性。该模式适用于各类数据结构展示(列表、表格、树形),能够高效处理数据与界面

2025-06-18 14:43:59 1988

原创 struct的内存对齐学习笔记

内存对齐是指数据在内存中的存储起始地址是某个值的倍数,在C语言中,结构体是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构体、联合体等)的数据单元。在结构体中,编译器为结构体的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构体的地址相同。

2025-06-16 20:28:15 968

原创 字符集与字符编码学习笔记+CPPQT开发中字符串转化乱码问题

文章摘要:本文探讨了Qt开发中遇到的字符串乱码问题及其解决方案。当代码移植到不同主机时,由于Qt默认使用Unicode编码而Windows系统采用GBK系列编码,导致中文字符显示异常。通过将QString::fromStdString()替换为QString::fromLocal8Bit()实现编码转换,解决了乱码问题。文中还系统梳理了字符集与编码的核心概念:字符集定义字符集合(如ASCII、Unicode),编码则决定存储规则(如UTF-8、GBK)。重点解析了Unicode与UTF-8的关系,指出UT

2025-06-16 20:25:13 934

原创 QT5中的QGraphics图形视图框架学习笔记(Item、Scene和View)

Qt图形视图框架提供了一套完整的图形处理工具,主要由三元素构成:QGraphicsView(视图)、QGraphicsScene(场景)和QGraphicsItem(图形项)。视图负责渲染场景内容并处理用户交互,场景管理图形项的布局和事件分发,图形项则是场景中的可视化对象。该框架支持缩放、旋转、平移等操作,通过坐标系转换函数实现不同层级间的映射,并允许自定义交互行为,如橡皮筋选择和拖拽模式。开发者可以高效地创建复杂的交互式图形应用,处理大量图形元素的显示与操作。

2025-06-12 16:58:44 3064

原创 进程与线程学习笔记

进程是操作系统资源分配的基本单位,拥有独立地址空间;线程是CPU调度的基本单位,共享进程资源。线程私有栈区、程序计数器和寄存器等上下文信息,共享进程的代码区、数据区和堆区。单核CPU通过时间片轮转实现并发,多核CPU可实现真正的并行。进程上下文保存了执行状态以便切换恢复,线程切换开销更小但稳定性较弱。全局变量和堆内存为线程间共享资源,需要同步机制避免冲突。

2025-06-12 16:58:08 1251

原创 yolov8自带的predict函数相关参数说明

YOLOv8 是一种先进的目标检测模型。predict 函数是 YOLOv8 中用于进行预测的主要接口。在使用这个函数时,可以通过不同的参数来控制预测过程的行为。

2025-05-29 15:32:29 1025

原创 CPP中CAS std::chrono 信号量与Any类的手动实现

本文摘要:C++多线程编程核心概念解析:原子操作与CAS:介绍了std::atomic实现原子操作的方法,包括计数器、标志位和自定义类型的原子操作,以及CAS(Compare and Swap)原理。时间处理:讲解了std::chrono库的时间段(duration)、时钟(clock)和时间点(time point)概念,演示了精确延时和算术运算的使用方法。信号量:说明信号量在C++20中的标准实现,并给出自行实现的计数信号量和二元信号量方案,展示了线程同步的实际应用。Any类型

2025-05-29 15:12:41 1481

原创 C语言经典笔试题目分析(持续更新)

本文主要讨论了C语言中的几个关键概念和代码实现。首先,解释了static关键字在函数和局部变量中的不同含义:用于函数时限制其作用域为当前文件,用于局部变量时延长其生命周期。接着,通过代码示例分析了全局变量的初始化和函数调用对变量的影响,指出a的值最终为3。然后,详细说明了32位单片机系统中结构体的内存对齐规则,并计算了两个结构体的长度分别为8字节和12字节。此外,介绍了如何使用typedef定义函数指针类型,并通过指针调用函数。最后,提供了宏定义实现位操作和数组元素个数计算的方法,并实现了一个将十六进制数转

2025-05-15 21:20:03 1077

原创 Linux通信开发muduo网络库学习笔记

muduo库是一个基于非阻塞IO和IO多路复用的C++高并发TCP网络编程库,采用Reactor模式实现,支持多线程并发处理。其核心架构为“one loop per thread”,每个线程拥有独立的事件循环(EventLoop),主线程负责监听新连接,子线程处理具体连接事件。muduo库的主要组件包括TCPServer、EventLoop、TcpConnection、TcpClient和Buffer类,分别用于管理服务器、事件循环、连接、客户端和数据缓冲区。通过muduo库,开发者可以将业务逻辑与网络层解

2025-05-15 16:44:00 1080

原创 c++ std库中的文件操作学习笔记

C++标准库中的 <fstream> 头文件提供了 std::ifstream、std::ofstream 和 std::fstream 类,分别用于文件读取、写入及同时读写操作。这些类继承自 std::istream、std::ostream 和 std::iostream,提供了类型安全的文件操作接口。std::ifstream 用于读取文件,std::ofstream 用于写入文件,std::fstream 支持同时读写。文件可以通过构造函数或 open() 函数打开,并支持多种打开模式组合

2025-05-13 23:05:09 2865

原创 Redis学习笔记

Redis是一种高性能的内存数据结构存储系统,广泛应用于缓存、会话存储、消息队列、实时分析等场景。它支持多种数据结构如字符串、哈希、列表、集合等,并提供丰富的操作命令。Redis基于内存存储,具有极高的读写速度,同时也支持持久化机制(RDB和AOF)来确保数据安全。其单线程架构简化了并发控制,提升了效率。此外,Redis通过哨兵和集群机制实现了高可用性和水平扩展。在实际应用中,Redis常被用作消息队列,开发者在使用时需注意发布与订阅命令需在不同的上下文中执行,以确保消息的跨服务器通信。通过合理配置和使用,

2025-05-13 22:20:21 1154

原创 YOLOv8训练过程与结果评价指标分析

训练完成后产生的文件如下首先我们需要明确精确率与召回率,即分别反映预测准确性和正类覆盖能力。精确率关注预测结果中正确识别的比例,召回率侧重真实正类中被正确找出的比例。两者常需权衡,具体应用场景决定侧重方向。**精确率(Precision)**衡量模型预测为正类的样本中真实正类的比例。其计算公式为:精确率=TP/(TP+FP),其中TP为真正例(预测正确且实际为正类的样本),FP为假正例(预测错误但实际为负类的样本)。

2025-05-09 22:05:20 3221

原创 OPCUA,OPCDA与MODBUS学习笔记

OPC协议(OLE for Process Control,即过程控制的OLE)是一种标准化的通信协议,旨在帮助不同厂商的设备、控制系统和软件之间进行数据交换。OPC协议的目标是提供一种统一的接口,使得各种不同品牌、类型的硬件设备可以方便地与上层软件(如SCADA系统、HMI界面、监控系统等)进行无缝对接。OPC协议最初由Microsoft和一批工业自动化厂商合作开发,基于Windows平台,目的是为了解决传统工业控制系统中不同硬件和软件之间的兼容性问题。OPC协议如今已经发展出了多个版本

2025-05-08 22:54:32 1996

原创 Lua学习笔记

Lua是一种轻量级的、高效的、可扩展的脚本语言,由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)的一个小团队开发。Lua的设计目标是成为一种嵌入式的脚本语言,因此它的语法简单、易于学习、易于嵌入其他程序中,并且运行速度非常快。所以Lua是一种上手成本很低的脚本语言。这里放下Lua代码与注释,方便快速上手,下再详细介绍--注释方式--[[多行注释--]]

2025-05-08 21:40:29 1208

原创 nginx配置集群服务器中的tcp负载均衡器

假设一台机器支持两万的并发量,现在我们需要保证八万的并发量。首先想到的是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题。但是单台机器的性能毕竟是有限的。这个时候我们就可以增加服务器的数量,将用户请求分发到不同的服务器上分担压力,这就是负载均衡。那我们就需要有一个第三方组件充当负载均衡器,由它负责将不同的请求分发到不同的服务器上。这里介绍Nginx的负载均衡功能。Nginx作为tcp把client的请求按照负载算法分发到具体的业务服务器ChatServer上能够。

2025-04-29 17:28:34 1097

原创 Linux开发中的线程管理(C++11 std::thread)

std::thread 是 C++11 引入的一个类,是 C++11 标准库中的一个关键特性,它提供了一种在 C++ 程序中创建和管理线程的方法。通过使用 std::thread,可以很容易地在你的 C++ 程序中创建多线程应用程序。每个 std::thread 对象都代表了一个独立的执行线程,这些线程可以并行地执行不同的任务。

2025-04-29 15:40:09 1227

原创 Linux环境变量配置与std访问环境变量

首先介绍一下Linux下各目录操作符的含义:~/.bashrc-~” :表示主目录,也就是当前登录用户的用户目录。“/” :是指根目录:就是所有目录最顶层的目录。“./” :表示当前目录,./ 一般需要和其他文件夹或者文件结合使用,指代当前目录下的东西。“. .” :表示上级目录“/.” :隐藏文件前会带.如.bashrc作用域与类型类型生效范围配置文件生命周期临时变量当前Shell会话 无(命令行设置)终端关闭失效用户变量单用户所有会话用户登录加载系统变量。

2025-04-28 21:31:50 1161

原创 池类设计的常客,单例模式

单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

2025-04-28 15:29:24 1137

原创 C++11线程间通信同步与Linux中MySQL连接池实现

适用场景生产者-消费者队列:队列空/满时的线程同步。任务调度:线程池中任务的分发与执行。资源池管理:如数据库连接池的分配与回收。与信号量的区别特性条件变量信号量C++标准支持C++11C++20灵活性需手动管理条件,更底层直接通过计数器控制资源访问适用场景复杂条件判断(如队列空/满)简单资源计数限制协作机制需结合互斥锁和条件检查独立的计数操作(acquire/release)条件变量是 C++11 多线程编程中实现复杂同步逻辑的核心工具。

2025-04-27 18:43:53 1150

原创 c/c++中常用循环的执行逻辑

在C++(以及C、Java等类似的语言)中,和虽然在表面上看起来相似,但它们在循环执行和条件判断方面有着显著的不同。这种差异主要体现在循环的起始条件和循环体执行后索引值的变化上。

2025-04-21 20:24:17 710

原创 JSON学习笔记

JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。我们最常使用的存储数据的方式有很多,比如利用txt文件存,利用xml存,利用word存,利用Excel存,如果我们要求比较高,还可以使用数据库存。(2)父子节点的形式,这种方法可以定义更为复杂的形式,缺点就是定义起来较为麻烦。在一级对象后直接跟不同的二级对象作为区分,并针对二级对象进行赋值或添加的操作。定义的JSON数据结构如下。

2025-04-19 16:45:30 807

原创 GNU,GDB,GCC,G++是什么?与其他编译器又有什么关系?

首先GNU是什么呢,GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。因为当时1969年在贝尔实验室诞生的Unix是商业操作系统。

2025-04-19 15:08:53 1226

原创 C++学习:std::function与std::bind

在C++工程实践中,bind绑定器和function函数对象非常的重要,依靠他们可以便捷的实现松耦合。

2025-04-18 18:07:58 1427

原创 CMake的配置使用

gcc或g++的编译指令如下1即为生成的文件可以是可执行文件或.a静态库.so动态库,2为生成的命令,生成什么文件,3要编译的文件名,4为头文件包含目录,5为库目录路径,6为库文件名-lmuduo_net即为-l muduo_net实际上稍微大一些的项目用g++编译还是比较麻烦的,用cmake的来进行构建会便捷一些使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。

2025-04-16 21:18:44 1340

原创 【Yolov8部署】 VS2019 + opencv + onnxruntime 环境下部署目标检测模型

本文主要研究场景为工业场景下,在工控机与工业相机环境中运行的视觉缺陷检测系统,因此本文主要目的为实现c++环境下,将yolov8已训练好的检测模型使用onnxruntime 部署通过cpu或gpu cuda加速进行检测运算。

2025-03-31 21:01:04 1587

原创 【Yolov8部署】 VS2019 + opencv - dnn CPU环境下部署目标检测模型

本文主要研究场景为工业场景下,在工控机与工业相机环境中运行的视觉缺陷检测系统,因此本文主要目的为实现c++环境下,将yolov8已训练好的检测模型部署在opencv中通过cpu进行检测运算如下为成功运行例程,检测图像涉及科研项目,此处不便展示。

2025-03-27 21:48:43 1616 3

原创 QT网络通信的接口与使用

在Qt中实现TCP通信主要依赖 QTcpServer(服务端)和 QTcpSocket(客户端和服务端通信)类。TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯。控制器可以设置为服务器端或客户端。服务端(简化版)Q_OBJECTpublic:private:客户端(简化版)Q_OBJECTpublic:private:运行效果。

2025-03-24 20:40:47 1324

原创 c++中的四种cast转换

C++继承并扩展C语言的传统类型转换方式,提供了功能更加强大的转型机制(检查与风险)C++11之后,C++中就有四种类型转换,分别是,一般用这四种强制转换可以替代在c代码中类似(int)这种方式的转换。如这个表达式将expression转换为一个type-id类型的对象。Type-id必须是一个指针、指向一个已经定义类的类型或一个指向 VOID 的指针。Expression的类型必须是一个指针,如果type-id是一个指针;当type-id是一个引用的时候必须是一个左值。

2025-03-24 17:02:46 1466

vmware workstation虚拟机软件安装包

vmware workstation虚拟机软件安装包

2024-10-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除