- 博客(267)
- 收藏
- 关注
转载 Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
Qt是一个跨平台的C++应用程序框架,广泛用于开发具有图形用户界面的应用程序。Qt提供了丰富的UI组件和功能,使得开发者能够轻松创建复杂的桌面应用程序。同时,Qt还支持多种操作系统和硬件平台,提高了应用程序的可移植性。应用场景:桌面应用程序、嵌入式系统、移动应用开发等。为了丰富应用的功能,可以在Qt, OpenCV与OpenGL的基础上实现各种自定义的渲染效果、滤镜和效果。例如,在OpenGL中,可以使用着色器编写自定义渲染效果;在OpenCV中,可以开发自定义滤镜,如风格迁移、虚化背景等;
2025-06-07 08:00:00
58
原创 使用VTK还是OpenGL集成到qt程序里哪个好?
摘要: 在Qt程序中选择VTK还是OpenGL进行三维可视化需权衡项目需求与开发条件。VTK作为高层次框架,适合快速实现复杂科学数据可视化,集成简便但性能可能受限;OpenGL提供底层图形控制,适合高性能渲染和自定义效果,但开发复杂度高。决策时应考虑项目类型(数据可视化优先选VTK,实时渲染选OpenGL)、开发周期及团队技术储备。两者均支持跨平台,但VTK的社区资源更利于初学者。最终选择取决于具体场景的效能与开发效率平衡。
2025-06-06 19:45:00
873
原创 VTK|8.2.0升级到9.4.2遇到的问题及解决方法
本文介绍了VTK 9.2.4源码编译中的常见问题及解决方案。主要包含:1)头文件路径问题,需修改CMake配置为模块化包含方式;2)Qt模块重构导致的QVTKOpenGLWidget.h缺失,需改用QVTKOpenGLNativeWidget并调整CMake配置;3)接口变更导致SetRenderWindow/GetInteractor方法失效,需使用新版API;4)构建配置优化,明确指定所需模块并关闭默认全部构建。解决方案具体包括CMake配置修改、头文件路径调整和API调用方式更新,确保VTK 9.x版
2025-06-06 18:15:00
1089
原创 Qt|实现将QTreeWidget类item对象鼠标左键拖拽效果到QWidget接收
摘要:本文介绍了在Qt中实现QTreeWidget项鼠标左键拖拽到QWidget的完整方案。发送方(QTreeWidget)通过重写startDrag()函数,设置MIME数据并创建拖拽操作;接收方(QWidget)需实现dragEnterEvent、dragMoveEvent和dropEvent三个事件处理函数。文章详细说明了标准MIME类型(如text/plain)的使用方法,并提供了自定义MIME类型的实现方案,包括数据格式设置、类型检查及数据获取。该方案支持可视化拖拽效果,可根据实际需求扩展数据传递
2025-06-01 12:00:00
1232
1
原创 VTK|实现类似CloundCompare的测量功能
CloudCompare测量工具显示摘要: 该工具提供点、线、面三种测量模式,均显示在浮窗中。点模式显示局部/全局坐标、RGB值和三角面片ID;线模式展示坐标差、平面投影距离和三维欧式距离;面模式则包含顶点ID、边长、夹角及法向量分量。配套菜单控件采用Qt实现,支持无边框悬浮窗和四种测量操作(点/线/三角形/关闭),通过事件过滤实现位置跟踪,按钮点击触发相应信号并更新高亮状态。
2025-05-31 12:15:00
432
原创 CloudCompare-源码分析-绘制与 3D 场景分离的“前景”元素
摘要: 该代码段展示了ccGLWindowInterface类中drawForeground方法的实现,主要处理OpenGL窗口的2D前景绘制。方法首先设置正交投影并禁用深度测试,随后根据交互标志决定是否启用虚拟变换。通过调用m_globalDBRoot和m_winDBRoot的draw方法绘制2D实体,并显示当前标量场颜色条。代码还包含对叠加元素的处理:如比例尺显示、三轴坐标系渲染、GL滤镜横幅(含半透明背景和文本标签)、屏幕消息的层级布局(左下角、上中部或屏幕居中),以及LOD进度指示器的动画绘制。所有
2025-05-31 12:00:00
634
原创 CloudCompare-源码分析-处理滚轮事件
摘要:该文分析了CloudCompare中处理鼠标滚轮事件的onWheelEvent函数,解释了其对比例尺更新的间接影响。函数根据是否处于Bubble视图模式,分别调整FOV或计算缩放幅度delta,并通过moveCamera改变视图参数,进而更新pixelSize值。在重绘阶段,drawScale函数利用变化的pixelSize重新计算并显示比例尺,实现随滚轮缩放自动调整的效果。整个流程通过视图参数变化触发比例尺更新,形成完整的视觉反馈链。
2025-05-30 19:45:00
523
原创 CloudCompare|源码分析ccGLWindowInterface::renderToImage(...)-将当前 3D 渲染窗口内容导出为 `QImage`(屏幕截图)
摘要:该代码实现了通过FBO(Frame Buffer Object)将OpenGL窗口内容渲染为QImage的功能。主要流程包括:检查FBO支持情况,设置视口参数,创建FBO对象,执行完整渲染过程,处理GL滤镜,最终返回渲染图像。代码还处理了缩放因子、特性尺寸调整、立体渲染模式等多种情况,并包含错误处理和内存管理,确保渲染结果的正确获取。
2025-05-30 19:30:00
896
原创 VTK|Z轴拉伸功能的实现
摘要 本文解释了在数据处理中始终坚持使用原始数据而非处理后的数据的重要性。原因在于对处理后的数据进行变换会导致重复叠加、非线性变形和精度丢失,使最终结果不可控。原始数据作为"干净基线",能确保变换简单、可重复且稳定。文章通过技术对比和实例说明,展示了原始数据和处理后数据在Z轴拉伸等操作中的表现差异。为规范处理流程,作者实现了一个ModelPipelineBuilder类,封装了模型加载和基础处理功能,包括Z轴拉伸和Elevation着色等操作。该类保留原始数据作为处理起点,每次变换都重新
2025-05-28 21:04:02
900
原创 CloudCompare|点测量功能源码分析
功能实现方式绑定渲染窗口linkWith()注册监听点拾取start()处理拾取结果调用停止拾取并解绑stop()留给子类扩展逻辑(纯虚函数)是一个轻量的、无边框窗口(通过设置);能够被挂接到一个 3D 显示窗口;通过事件过滤器监听快捷键输入等;提供start()stop()流程控制接口;使用信号槽机制和主窗口通信。用户在视图中点击点、三角形、实体中心等事件;获取拾取的 3D 点、点击位置、面片索引等。基类功能类型特点说明UI框架。
2025-05-28 18:15:00
848
原创 VTK|显示三维图像的二维切片
MeshSliceController 类用于管理和显示三维网格数据的二维切片。该类通过 VTK 库实现,支持沿 X、Y、Z 轴方向的切片操作。主要功能包括显示、隐藏切片,以及更新网格数据。类中定义了 SliceDirection 枚举类型,用于指定切片方向。ShowSlice 方法根据指定方向生成切片,并通过 vtkPlane 和 vtkCutter 实现切割操作。切片结果通过 vtkPolyDataMapper 和 vtkActor 渲染为红色线条。HideSlice 方法用于隐藏当前切片,Update
2025-05-19 18:15:00
278
原创 VTK|箱体切割器
BoxClipperController 类是一个用于管理基于盒子的网格数据裁剪操作的控制器。它通过 vtkBoxWidget 实现用户交互,允许用户调整裁剪盒子的位置和大小,并实时更新裁剪结果。类的主要功能包括设置输入数据、启用或禁用裁剪功能、获取裁剪后的 Actor 等。构造函数初始化了裁剪所需的组件,如 vtkBoxWidget、vtkClipPolyData 和 vtkActor,并通过回调函数监听用户交互事件以更新裁剪结果。SetInputDataAndReplaceOriginal 方法用于设置
2025-05-19 18:15:00
360
原创 VTK|类似CloudCompare的比例尺实现2-vtk实现
ScaleBarController 类用于管理和绘制屏幕固定像素长度的比例尺,主要依赖于 VTK 库进行渲染和交互。类头文件 ScaleBarController.h 定义了类的结构,包括构造函数、更新比例尺的方法、重新添加到渲染器的功能,以及处理交互事件的回调函数。类还包含多个 VTK 对象,如渲染器、窗口、交互器、线段和文本 Actor 等,用于绘制比例尺的线条和标签。 在 ScaleBarController.cpp 源文件中,构造函数初始化了渲染器、窗口和交互器,并创建了比例尺的线条和文本 Act
2025-05-14 16:13:39
1278
原创 VTK|类似CloudCompare的比例尺实现1-源码分析
CloudCompare 的比例尺功能通过 ccGLWindowInterface::drawScale() 函数实现,主要用于在正交视图下显示空间尺度。该函数首先通过断言确保仅在正交模式下使用,随后计算比例尺的最大宽度(占屏幕宽度的25%),并将其转换为实际长度(如米)。接着,函数准备字体和图形区域,计算比例尺的绘制位置,并使用 OpenGL 绘制比例尺线段及端点刻度。最后,函数在比例尺下方居中显示长度文字标签(如“10”)。整个过程通过精确计算和图形绘制,直观地展示了当前视图的空间尺度,便于用户理解场景
2025-05-13 21:15:00
895
原创 git|gitee仓库同步到github
本文详细介绍了如何在Gitee平台上实现与GitHub仓库的镜像同步。首先,用户需要在Gitee的仓库管理界面中添加镜像,并绑定GitHub账号。接着,文章指导用户如何申请GitHub的私人令牌,这是授权Gitee读写GitHub仓库的关键步骤。申请过程中,用户需在GitHub的开发者设置中生成新的私人令牌,并选择适当的权限范围。最后,将生成的私人令牌填入Gitee的镜像设置中,即可完成镜像的添加和同步。整个过程旨在帮助用户更高效地管理跨平台的代码仓库。
2025-05-12 21:15:00
692
原创 Git常用操作
Git 是现代软件开发中不可或缺的版本控制工具,本文介绍了其常用操作,帮助开发者快速上手并提高效率。首先,Git 是一个分布式版本控制系统,每个开发者的本地仓库都包含完整的代码历史。使用前需进行基本配置,如设置用户名和邮箱。常用操作包括初始化仓库、克隆远程仓库、查看状态、添加文件到暂存区、提交更改、查看提交历史、分支管理、合并分支、查看差异、撤销更改、远程操作和暂存更改等。此外,还提供了一些实用技巧,如使用 .gitignore 文件忽略不需要版本控制的文件,提交信息要简洁明了等。掌握这些基本命令和技巧,可
2025-05-12 21:15:00
512
原创 VTK|.obj文件数据处理+Jet/Viridis/CoolToWarm/Grayscale/Rainbow/风格颜色渲染
将.obj数据进行 Elevation 着色并可视化渲染的完整流程和.ply文件处理方式一样。
2025-05-08 23:44:07
616
原创 VTK|加载ply文件数据进行平移+高程渲染
步骤说明为每个点生成 Z 值标量创建 Jet 风格 LUT点 → vtkVertex,确保可渲染④ Mapper设置映射、颜色 LUT、标量范围⑤ Actor设置点大小、构建可视化对象⑥ Renderer清除旧内容、添加新 Actor、刷新界面。
2025-05-08 10:38:08
750
原创 vtkSmartPointer<vtkPolyData> 常用的函数方法
是 VTK 中专用于表示多边形网格点(Points)线段(Lines)多边形(Polygons)三角形带(Triangle Strips)属性(Scalars、Normals、Vectors、Texture Coordinates)功能方法 / 类设置点设置面SetPolys()设置线SetLines()获取点/单元GetPoint()GetCell()添加属性法线生成网格简化清理重复点深拷贝DeepCopy()边界提取是进行三维建模和可视化的基础类。
2025-05-07 20:04:56
311
原创 VTK|结合qt创建通用按钮控制显隐(边框、坐标轴、点线面)
也可以使用qpushbutton进行控制,逻辑更加简单,不需要场景里添加按钮了,创建按钮后直接连接toggleSurfaceVisibility即可。增加边框BoundingBox并通过按钮控制显隐。需要的全局变量,防止重复创建。需要的全局变量,防止重复创建。
2025-05-06 14:41:18
499
原创 VTK|显示.ply格式(点云) .obj格式(mesh) .tif(geoTIFF)文件
PCL 是一个强大的点云处理库,它依赖于 VTK 进行可视化。虽然 VTK 可以直接加载 PLY 文件,但 PCL 提供了更多的处理功能,因此在一些项目中开发者会选择结合使用 PCL 和 VTK。PLY 文件有多种格式,包括 ASCII 和二进制格式,以及有组织和无组织的点云数据,这使得它适用于不同的应用场景。但是!我只想显示ply文件并不想处理ply文件数据,so,直接使用vtk显示点云数据// 打印调试信息// 计算中心和 Z 方向缩放因子(夸张Z轴)
2025-05-05 15:00:01
768
原创 C++|养成良好的代码规范(那些年我踩过的坑)
语法:使用namespace关键字定义命名空间。示例问题:宏重定义可能导致意外的行为和难以调试的错误。解决方案:使用#ifndef检查是否已定义宏。// 宏定义内容#endifenum class问题:传统的enum可能导致枚举值之间的冲突和隐式类型转换。解决方案:使用enum class定义枚举值,这样可以避免枚举值之间的冲突,并且enum class不会隐式转换为整数类型。Active,Inactive问题。
2025-04-23 20:21:01
1165
原创 C/C++语言常见问题-智能指针、多态原理
引用计数器会在拷贝、赋值、销毁、移动和重置时改变。:弱引用计数器会在创建和销毁时改变,但不会直接影响对象的生命周期。:不使用引用计数器,控制块在所有权转移时改变。智能指针的这些机制确保了对象的生命周期被正确管理,同时避免了内存泄漏和其他资源管理错误。多态性指的是同一个操作作用于不同的对象时,可以有不同的解释和不同的执行结果。在编程中,这通常意味着同一个方法或函数可以被不同的对象以不同的方式实现。
2025-04-17 20:52:48
576
原创 Trea初体验:使用Trea从零到一创建一个项目,用来演示glog库的使用,一行代码没改完成了整个项目的搭建运行
虽然使用起来部分指令、路径、网络问题等还是令人有点抓狂,其实一个月前刚发布国内版的时候就已经开始写这篇文档了,但是在导入编译vcpkg、glog的过程中经常卡住,不管我翻墙还是不翻墙都会卡住,建议修复这个问题,建立国内镜像链接来进行拷贝编译。上述执行成功后,其实所有资源文件已经齐全了,执行下一条编译指令会报错,报错信息贴出后得出此回答,是无法加载缓存文件的问题,需要把之前编译的文件删除重新编译即可,执行如下指令。问题1:它这个运行每次都会开一个新的终端,导致路径就不对,执行出来也不对,鸡肋哈哈。
2025-04-17 20:50:48
905
原创 Qt UI框架和Duilib UI框架差别
Qt以其强大的功能、广泛的平台支持和丰富的资源,适合长期发展和大型商业项目。而Duilib因其简易上手和开源特性,成为初学者的良好选择。开发者可以根据项目需求、团队技术背景和预算等因素,选择最适合的UI框架。
2025-04-05 02:01:57
536
原创 C++|GLog开源库的使用 如何实现自定义类型消息日志
就20250121搜集到的资料来看glog目前不支持自定义等级消息等级,但是可以通过添加标识符,宏定义,重写glog中的send函数实现。可以定义一个宏来封装日志记录操作,同时在宏中添加特定的标签或前缀。示例代码// 自定义日志接收器public:private:// 将日志内容包装为 std::string// 使用 stringstream 获取日志消息内容// 构造日志输出格式// 根据 severity 判断日志类型// 检查日志消息中是否包含特定标签。
2025-03-21 14:45:25
566
原创 我的创作纪念日
这些是我刚毕业的时候无法想象的,虽然目前在编程方面,对于架构,算法优化等多个层面来说,人工智能助手还不那么好用,但我是相信它会逐渐取代大部分工作和工种的,我也认为人类不应该囚禁在大量的重复劳动当中,但是未来人类靠什么谋生确实也是个问题吧,不过我没什么好担心的,普通人每天不会因为死亡而焦虑,所以也没必要因为一个自己控制不了且一定会发生并且正在发生的事情焦虑。每年都让我写初心,有什么初心,就是想当个笔记本,能帮到大家是顺便更好的事,能吸引来更多大佬一起学习交流更是更好的事。提示:在创作的过程中都有哪些收获。
2025-03-19 23:29:15
384
原创 GenICam GenTL 标准 ver1.5(1)GenICam简介与框架
GenICam(Generic Interface for Cameras)是一种工业相机接口标准,旨在为机器视觉行业提供一个统一的、标准化的相机接口。它允许不同制造商生产的相机能够通过一个通用的接口与各种图像采集软件和硬件进行交互。这种标准化的接口极大地简化了相机的集成过程,降低了开发成本,提高了系统的可扩展性和兼容性。GenICam标准涵盖了从相机硬件接口到数据传输协议的多个方面。
2025-03-18 21:15:00
963
原创 项目管理工具:提升团队效率的利器(以Jira和Trello为例)
Jira是一款由Atlassian公司开发的项目管理工具,最初是为敏捷开发团队设计的,但如今已广泛应用于各种类型的项目管理。它提供了强大的功能,支持敏捷开发方法(如Scrum和Kanban),同时也能满足传统项目管理的需求。Jira的核心优势在于其高度的可定制性和灵活性,能够适应不同规模和类型的团队。Trello是一款基于看板(Kanban)方法的项目管理工具,以简单直观的用户界面和操作方式而闻名。它通过看板和卡片的形式,帮助团队可视化任务和工作流程。
2025-03-18 21:15:00
1041
原创 关系型数据库管理系统介绍
特性/数据库MySQLOracleSQL ServerPostgreSQLSQLite达梦数据库人大金仓数据库DB2MariaDBFirebirdInterbaseSybase ASE开源性开源,GPL许可证商业闭源商业闭源开源,PostgreSQL许可证开源,公共领域许可证商业闭源商业闭源商业闭源开源,GPL许可证商业闭源开源,MPL许可证商业闭源商业闭源开源,MPL许可证商业闭源性能高性能,适合Web应用高性能,适合大规模企业应用。
2025-02-09 11:29:45
1314
原创 代码模块化开发而不是全部代码写在构造函数里的优点
祝大家都能养成良好的代码编写习惯,拒绝屎堆代码!!!代码模块化开发是一种将程序分解为独立、可重用的模块或组件的开发方法。
2025-01-24 22:14:43
867
原创 算法|牛客网华为机试53-62C++
还可以接受一个可选的第四个参数,这是一个二元操作函数或函数对象,用于指定如何合并元素,而不仅仅是加法。动态规划,分两种情况,有空盘子和没有空盘子,递归到最后只有两种情况,0个盘子放n个苹果或者n个苹果放1个盘子。这个头文件提供了一些用于数值计算的函数模板,比如累加、累乘、部分求和等。头文件中定义的一个函数模板,它用于计算一个范围内所有元素的累加和。是一个迭代器类型,它可以指向任何支持递增和解引用操作的容器或数组的元素。是C++中的一个预处理指令,用于包含标准库中的。是累加结果的类型,也是初始值的类型。
2025-01-24 22:09:19
1063
原创 C++|开源日志库log4cpp和glog
如果需要高性能和高效的异步日志,可以选择spdlog或loguru。如果项目已经使用了BoostBoost.Log是一个非常合适的选择。如果需要更全面的功能,如日志分割、归档等,可以选择或。对于Qt项目,使用 Qt 自带的QDebug会是最方便的选择。如果需要一个轻量级的解决方案,MinLog或ZLog是不错的选择。根据你的需求(性能、功能、配置灵活性、平台支持等)来选择合适的日志库。
2025-01-21 11:14:56
1664
原创 C++|CRC校验总结
参考:Vector - CAPL - CRC算法介绍开发工具 > CRC校验工具循环冗余校验(Cyclic Redundancy Check,简称CRC)是一种数据校验算法,广泛用于检测数据传输或存储过程中的错误。它通过计算数据的校验和来检测数据是否在传输过程中发生了错误。以下是几种常用的CRC校验算法:CRC-8CRC-16CRC-32CRC-64CRC算法特点CRC算法实现CRC算法通常通过位操作实现,包括位移、异或等操作。对于不同的多项式和数据长度,可以预先计算出一个查找表(lookup ta
2025-01-15 21:28:38
1279
1
转载 c++ 类之间的依赖问题:impl、代理模式
使用IMPL方式来较少类之间的依赖,减少编译时间变量可以使用指针,一大推变量使用结构体,类可以使用一个托管类,大致这三类型来实现减少依赖其实本质上来说,头文件之间就不应该有定义的依赖,所以java中统一使用了指针,实现cpp中才是真正包含所有具体定义,头文件是用来声明这个类长什么样子,实现cpp中用来实现这个类内部怎么实现的一个圆,圆内是你会的,圆外是你不知道的。而当圆越大,你知道的越多,不知道的也越多了。
2024-12-12 10:30:56
313
原创 Qt|绘制100万个图元大规模场景
工程总览:w.show();创建工程自带的QMainWindow,里面只创建了一个创建百万圆类:.hQ_OBJECTpublic:private:.cpp{}最关键的创建百万圆类:.hQ_OBJECTpublic:signals:// 场景初始化部分完成的信号// 场景初始化部分完成的槽函数private:// 场景// 视图// 线程池// 状态标签// 记录现在已经完成了多少个图元的创建.cpp。
2024-11-10 22:54:35
815
原创 算法|牛客网华为机试41-52C++
深度优先搜索一定要对递归过程有深入的理解,这样才能越做越顺,初做此类题型时不要盲目追求做题速度,多画一画递归树,了解了DFS运行机制以后,再去做同类题型就会得心应手。题目的意思就是找出字符串出现次数最多的字母,从26开始赋值,依次递减,出现次数第二多的为25…最后计算漂亮度总和最高的。俺也不知道47、49去哪了,写着写着就没了,就像很多公司让等着等着就没信了。string的substr()函数可以截取制定位置字符串。
2024-11-10 21:04:52
978
原创 算法|牛客网华为机试31-40C++
计算第5次落地后球经过的距离,除了第一次只经过一次,所以距离最后在减去初始长度,高度每次减去一半。for循环遍历一次,从后往前,如果是字符组成单词等遇到空格或者非字母输出。直接用sort函数就是按着ASCII码从小到大排序的。找每行每列的相加差1的数学规律,再每行输出。
2024-11-04 19:24:37
886
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人