- 博客(477)
- 资源 (10)
- 收藏
- 关注
原创 3D,从无知到无畏
文章目录算法原理1、[3D,那些你需要知道的硬件知识](https://blog.csdn.net/lxy_2011/article/details/120038261)2、[3D,点云中的2棵树](https://blog.csdn.net/lxy_2011/article/details/120268279)3、[3D,小白需要知道的点云概念](https://blog.csdn.net/lxy_2011/article/details/120285608)4、[3D,2大点云库](https://bl
2022-03-06 14:24:45 507 1
原创 Playing with OpenCV
一、从双目立体视差图中重建三维点云 1.【视差与深度信息】2.【用VS+Opencv3.1从双目立体视差图中重建三维点云】二、斑点检测Opencv中提供了SimpleBlobDetector的特征点检测方法。 Reference:1.【 Opencv中SimpleBlobDetector的使用(斑点检测)】2.【Opencv2.4.9源码
2017-12-04 19:43:29 988
原创 halcon基础知识
在算子编辑窗口,main所在行右边,有四个按钮,将鼠标移到该位置,将有中文提示,按提示点击按钮。浅蓝色:外部函数——HDevelop函数文件,可在所有Halcon程序中使用。Halcon自带的训练集数据是亮色背景上的暗色文字。紫色:内部函数——本地程序函数,只在当前程序使用。2.减法:常用于检测两幅或多幅图之间的变化。4.除法:矫正成像设备的非线性影响。1.加法:降低图像中的随机噪声。3.乘法:遮住图像的指定部分。深蓝色:图像获取和处理。
2016-10-14 15:11:08 5864
原创 EasyCloud软件简介
运行环境:Win10 + PCL1.9 + VTK8.1 + Qt5.12 + VS2017基于PCL点云库的三维点云数据处理软件本软件的用户界面主要包括以下几个部分(如图1):[1]菜单栏,将软件功能模块划分为不同菜单,包括文件、视图、显示,点云简化、特征提取、三维重建以及帮助等;[2]工具栏,常用工具按钮,如打开,保存,更改点云颜色等;[3]点云文件管理窗口,用资源树的形式组织管理当前的点云文件;[4]属性窗口,记录点云文件个数、点得个数,颜色等常用属性;
2024-03-22 10:33:37 26
原创 C++由动态链接库dll生成lib文件
在msvc中,对于动态库的使用,通常有两种方法,一种方法是动态加载,在程序运行过程中,使用LoadLibrary()、GetProcessAddress()和FreeLibrary()三个函数动态的对动态库进行加载和卸载,此方法在编译运行时只需要dll文件的支持即可;另一种方法是静态加载,静态加载不仅需要dll文件,在程序编译时也需要dll文件对应的lib文件,这个lib文件会记录动态库名称与函数入口,使程序开始运行时能够正确的对动态库文件进行载入并使用。
2024-03-14 19:33:25 543
原创 C#联合Halcon机器视觉框架源码
本软件参考EV开发,共用模块,基于WPF+Halcon,是非常不错的学习框架,需要什么功能可以自己添加,插件式开发非常方便。
2024-03-14 18:59:58 616 9
原创 设计模式之兼容不同厂家的相机
仔细看上面的代码,会发现一个问题,每一个实例工厂负责生产一个实例产品,也就是一个产品对应一个工厂,一个工厂对应一个产品,那么小米不仅仅生产相机,还生产耳机,智能手环,智能插座等等相关的小米产品簇,不可能给这每一个产品都创建一个工厂类,那样的话代码中的类就太多了,不好维护,而且也不符合实际情况。实际上小米或者华为的工厂里面,有相关联的产品簇都是在一个工厂完成创建的;写完后,初级程序员恍然大悟,抽象工厂模式把一个产品簇的产品放在一个工厂类中去创建,不仅大大减少了工厂类的个数,更符合现实中工厂生产产品的模式。
2024-02-24 16:13:06 370
原创 使用 Windows 调试器查找 GDI 泄漏
本文是有关使用Windows调试器查找和修复GDI句柄泄漏的演练。Windows调试器应该是最后的手段,首先在整个代码库中搜索并检查这两个函数调用之间的 GDI 代码是否有未删除的句柄并将其删除。使用任务管理器,我们可以在“详细信息”选项卡页上添加“GDI 对象”列,以获取每个进程当前打开的 GDI 句柄的数量。一个进程最多可以有 10000 个打开的 GDI 句柄。所有进程的系统范围限制为 65535。右键单击标题以选择要显示的列。选中“GDI 对象”选项以添加到“详细信息”选项卡并关闭对话框。
2024-01-08 21:34:13 870
原创 Windows10系统下CGAL的安装编译
在工具栏中打开Qt VS Tools–>Qt Options–>Add添加msvc_2017_64 = .\Qt5.12\5.12.0\msvc2017_64。(2)安装完成后,重启VS,点集文件->新建->项目->Qt就可以关于Qt的信息;(1)打开VS2022,扩展–>管理扩展–>联机–>搜索Qt–>安装Qt Visual Studio Tools。若提示环境变量设置失败,要让我们自行设置环境变量:PATH = .\CGAL-5.6\auxiliary\gmp。如果一切顺利,运行后可以看到如下结果。
2023-12-26 21:05:40 75
原创 异常处理与CrashRpt工具——(3)
CrashRpt是一个开源的第三方包,在程序出现未处理异常时,能够收集错误信息,并生成程序错误报告。CrashRpt可以将报告按照指定的方式(例如HTTP或SMTP)发送给开发者或者保存在本地,并且可以对生成的错误报告进行分析,定位错误位置,找出错误原因。
2023-12-20 08:09:49 48
原创 异常处理与CrashRpt工具——(2)
一种思想:在所有支持异常处理的编程语言中(例如java),要认识到的一个思想:在异常处理过程中,由问题检测代码可以抛出一个对象给问题处理代码,通过这个对象的类型和内容,实际上完成了两个部分的通信,通信的内容是“出现了什么错误”。例外:catch子句使用指针或者引用接收参数,并且在catch子句内你不访问异常类的成员,那么你的catch子句的异常说明符才可以是前置声明的类型。因为C++中可以抛出任何类型的异常,所以我们的异常类可以不继承标准异常类,但是这样可能会导致程序混乱,尤其是当我们多人协同开发时。
2023-12-16 19:46:43 66
原创 异常处理与CrashRpt工具——(1)
除此之外,我们可以为每一个异常设置若干处理函数,而这些处理函数会被放到一个链表中,当异常到达时,这些处理函数会被调用。语句不是这个异常错误所对应的正确异常处理模块,不能处理该异常,通知操作系统继续搜寻该线程其他的异常处理程序(系统将继续到上一层的。复合语句中的受保护执行的代码发生了异常,或受保护执行的代码调用的函数内部发生了异常并要求调用者来处理该异常,这样的语句是catch不到的,直接就会crash了,因为这是内存错误,硬件异常。中的代码,是在正常执行完之后进来的,还是因为全局展开或局部展开而进入的。
2023-12-13 19:31:50 44
原创 什么是特征图?
特征图是卷积神经网络的核心组成部分,因为它们从输入图像中捕获基本特征,以帮助网络决策。此外,它们允许CNN通过丢弃不需要的数据和保留重要信息来更快地处理大型数据集。
2023-12-10 09:42:23 254
原创 PCL 点云边界提取
目前PCL中应该只集成了AC,因为这个方法确实比HdC好,已经够用了。这两种方法的思路都非常简单,但是却非常有效,而往往流传下来的经典方法都是这种简单有效的方法。目前,在点云的边界特征检测(网格模型的边界特征检测已经是一个确定性问题了,见网格模型边界检测)方面,PCL中有一个针对点云边界的可以称作为是。这些问题在点云边界提取的研究和应用中是需要重点关注和解决的。通过改进算法和数据预处理方法,可以提高点云边界提取的准确性和效率。如图所示,第一行为非边界点邻域经过投影后,近邻点与当前点。的方法,这个方法出自。
2023-12-09 15:55:28 756
原创 Windbg常用命令
内建在调试引擎中的命令,提供标准命令没有提供的功能,命令以.开头,比如**.excr、.reload、.dump**等。:用于扩展某一方面的调试功能,实现在动态加载的扩展模块中,以!analyze**等。:基本的调试命令,不区分大小写,比如。
2023-11-30 20:54:11 173
原创 判断数组里面的元素是否都为某个数——C++ 算法库(std::all_of)
该函数对整个数组元素进行操作,可以节省运行循环来逐一检查每个元素的时间。它检查每个元素上的给定属性,并在范围内的每个元素满足指定属性时返回 true,否则返回 false。
2023-11-28 21:28:39 306
原创 C++ 用ifstream读文件
C++iostreamIOfstreamstringIO每个IO 对象都维护一组条件状态,用来指出此对象上是否可以进行 IO 操作。如果遇到错误——例如输入流遇到了文件末尾,则对象的状态变为是失效,所有的后续输入操作都不能执行,直到错误纠正。ifstreamofstreamfstreamfilebuf本文重点介绍ifstream。
2023-11-27 21:06:21 135
原创 C++《i+1》系列文章汇总
根据自己学习C++一路走来的心路历程,以及在工作和学习过程中对C++的不断思考和总结,详细阐述了C++的学习路线图,并以图文并茂的方式来普及C++基础、用好C++标准库,调试过程中的排疑解难,并教会大家不断精进的要点,适合基础进阶和想不断勇攀高峰的C++开发人员!
2023-11-25 12:18:07 116
原创 构建自己的插件框架:第 5 部分
这个插件框架相对于其他已有的系统具有一些独特的属性,并且灵活易用,兼顾C 和C++,提供多种部署方式(动态库和静态库)。然后,所有人都会忘记C,只需要扩展应用系统提供的顶层的对象模型来编写插件——这些都是使用C++ 编写的。正如你看到的那样,我们的游戏实在是太简单了。我们将从分析现有插件/组件系统开始,一步步深入了解如何开发插件框架,以及很多需要注意的问题,比如二进制兼容性等,在文章的最后,我们将给出一个比较合理的解决方案。的形式传入,经过处理后,其中的所有动态插件都被加载进来,静态插件则显式初始化。
2023-11-09 20:50:27 103
原创 构建自己的插件框架:第 4 部分
一个精心设计的C++ 包装类(由应用程序提供给插件开发者)会把C插件封装起来,将每一个非基本数据类型的C 参数包装成相应的C++ 类型,调用由插件对象实现的C++ 函数。我们将从分析现有插件/组件系统开始,一步步深入了解如何开发插件框架,以及很多需要注意的问题,比如二进制兼容性等,在文章的最后,我们将给出一个比较合理的解决方案。包装类对象保存其C 接口指针,在其函数的实现中,将对包装对象的函数调用直接转发给内部的C 接口指针,然后如果需要的话,还得再将返回结果进行包装。对于某些对象,这么做是可以的。
2023-11-09 20:46:33 97
原创 构建自己的插件框架:第 3 部分
对于一些应用程序而言,这些都不是问题,因为它们不会涉及到32 位的限制(如果是使用无符号整数,则是31 位),但是如果你需要在64 位系统序列化你的对象,又要在32 位系统上反序列化,那么你就得注意这个问题了。这里,我们从设计模式的角度来重构我们的简单的游戏,不过,对于你自己的业务模型,你必须自己动手了。但是,使用单一的类来处理插件的交互更为合适。我们将从分析现有插件/组件系统开始,一步步深入了解如何开发插件框架,以及很多需要注意的问题,比如二进制兼容性等,在文章的最后,我们将给出一个比较合理的解决方案。
2023-11-03 08:00:57 90
原创 构建自己的插件框架:第 2 部分
这种设计允许程序拥有充分的灵活性,插件可以尝试注册同一对象类型的多种版本,以便在兼容旧版本的情况下使用新接口的优点。我们将从分析现有插件/组件系统开始,一步步深入了解如何开发插件框架,以及很多需要注意的问题,比如二进制兼容性等,在文章的最后,我们将给出一个比较合理的解决方案。是一个通用版本,但是我们也会探讨,如何将一个通用设计的插件管理器转换成特定系统的。需要注意的是,插件框架提供了所有必须的基础接口,用于将C 对象适配成C++ 对象,但是仍然需要应用程序的帮助,因为它并不知道自己需要适配的对象类型。
2023-10-31 20:47:36 92
原创 构建自己的插件框架:第 1 部分
最基本的方式是定义一个接口,提供一系列插件(动态的或者是静态)需要暴露出的函数。这种实现从技术上说是可行的,但实际并不那么简单地操作。原因在于,一个插件需要支持两类接口,但是却只能暴露出一个接口的函数集。这意味着,两类接口必须混合在一起。第一个接口(协议)是通用插件接口。该接口允许中心系统初始化插件,能够将插件提供的用于创建、销毁对象的函数注册给中心系统。这个通用插件接口不是特定领域相关的,因此能够作为一个可复用库。第二个接口则是插件对象提供的功能接口。
2023-10-27 20:56:17 116
原创 一文详解手眼标定公式推导
这种,当然手眼标定还是有很多细节在里面的,比如怎么摆位置,相机的选型及机械臂的选型,希望大家一起探讨,文中若有任何不当之处也欢迎斧正。是我们要求得的转换矩阵,里面有6个线性无关的变量,其中旋转3个自由度,平移3个自由度。:机械臂末端坐标系(点)到机械臂基底坐标系(点)的旋转矩阵。:机械臂末端坐标系(点)到机械臂基底坐标系(点)的平移矩阵。为此,我们引入了一种新的东西——齐次变换矩阵。:机械臂末端坐标系到机械臂基底坐标系变换矩阵。求解目标:基底坐标系到相机的变换矩阵。求解目标:基底坐标系到相机的变换矩阵。
2023-10-26 09:16:41 131
原创 1024程序员狂欢节特辑 | 聊一聊Halcon中的3D手眼标定
要让机器人的手抓住杯子,就必须知道杯子跟手的相对位置关系,而杯子的位置则是通过机器人的眼睛看见的,所以,我们只需要知道机器人的手和眼睛的转换关系,就可以随时抓取机器人眼睛所看到的物体了。
2023-10-24 20:35:36 275
原创 嚼一嚼Halcon中的3D手眼标定
要让机器人的手抓住杯子,就必须知道杯子跟手的相对位置关系,而杯子的位置则是通过机器人的眼睛看见的,所以,我们只需要知道机器人的手和眼睛的转换关系,就可以随时抓取机器人眼睛所看到的物体了。
2023-10-24 20:31:43 1861
原创 点云平面拟合新国标怎么应对?
切比雪夫平面拟合的目标是找到平面模型参数 (A, B, C, D) 使得点云中的每个点到拟合平面的距离的最大值最小。
2023-10-20 20:51:13 608
原创 Halcon 3D相关案例分享
请注意,定向边界框的算法是随机的,并且可以为每次调用返回不同的框。生成的边界框使用其坐标系 (Pose) 进行描述,该坐标系的方向使得框的最长边与 x 轴对齐,第二长边与 y 轴对齐,最小边与 z 轴对齐。中每个点的最近点或三角形的索引,方法是将通用参数‘store_closest_index’设置为‘true’(参见下面)。计算到点或三角形的距离时,可以选择通过将通用参数“store_closest_index”设置为“true”(见下文),返回。注意,在使用“体素”方法时,不能计算最近的索引。
2023-10-19 21:24:55 1733
原创 本、硕、博区别真的辣么大吗?
到了大学本科主要是学“是什么”和“为什么”,这期间对“为什么”的掌握要比中学时多很多,并开始接触第三个层次,关于“怎样做”的问题,即学习一些初级的研究方法,但是这些研究方法对于独立做一项研究还是远远不够的。小学,老师告诉学生:“森林里有只老虎,已经被我关在笼子里,我会带你去那个地方,然后给你一把猎枪,告诉你猎枪怎么用,并开枪给你示范。中学,老师告诉学生:“森林里有只老虎,已经被我关在笼子里,在森林的西北角,我给你一把猎枪,告诉你猎枪怎么用,你自己去森林找到那只关着的老虎,干掉它。愣着干什么,还不快去种树。
2023-10-14 11:24:28 186
原创 C++实现高性能内存池(二)
在上面的类设计中可以看到,在这个内存池中,其实是使用链表来管理整个内存池的内存区块的。内存池首先会定义固定大小的基本内存区块(Block),然后在其中定义了一个可以实例化为存放对象内存槽的对象槽(Slot_)和对象槽指针的一个联合。我们知道,对于栈来说,链栈其实并不是最好的实现方式,因为这种结构的栈不可避免的会涉及到指针相关的操作,同时,还会消耗一定量的空间来存放节点之间的指针。事实上,我们可以使用。毫无疑问是整个内存池的关键所在,但实际上理清了整个内存池的设计之后,其实现并不复杂。
2023-10-10 21:04:50 561
原创 C++实现高性能内存池(一)
内存池是池化技术中的一种形式。通常我们在编写程序的时候回使用newdelete这些关键字来向操作系统申请内存,而这样造成的后果就是每次申请内存和释放内存的时候,都需要和操作系统的系统调用打交道,从堆中分配所需的内存。如果这样的操作太过频繁,就会找成大量的内存碎片进而降低内存的分配性能,甚至出现内存分配失败的情况。而内存池就是为了解决这个问题而产生的一种技术。
2023-10-10 21:02:00 254
原创 c++类模板template中的typename使用方法
在一个特定的时期,由于历史、技术、思想等各方面的因素,设计总会向现实做出一定的让步,出现一些“不完美”的设计,为了保持向后兼容,有些“不完美”的历史因素被保留了下来。现在我可以理解经常为人所诟病的Windows操作系统,Intel芯片,IE浏览器,Visual C++等,为了保持向后兼容,不得不在新的设计中仍然保留这些“不完美”,虽然带来的是更多的优秀特性,但有些人却总因为这些历史因素而唾弃它们,也为自己曾有一样的举动而羞愧不已。,一查才发现原来它是一种非常高级的技术,在更现的高级语言中已经很普遍。
2023-10-10 07:31:19 199
转载 如何让自己在行业内保持进步
*当参加了工作,可能看的最多的就是项目组的代码,我的第一份工作,运气不太好,是一份逻辑混杂,架构臃肿,基本无注释的代码,最让人头疼的是,熟悉代码的人离职了,业务逻辑全靠猜。例如很久以前你写了一个算法运行的方法类,当时只是为了实现一个简单的blob算法,随着项目的推进,你又在该方法中增加了模板定位、预处理、仿射变换等算法逻辑,当项目完成后,你的这个方法就变得很大,很难维护,这个时候一定要勇于否定自己,推翻现有冗杂的业务逻辑,抽象清晰模块,进行代码重构。如果你的开发心态出了问题,欢迎交流,共勉!
2023-09-23 13:12:43 63
原创 VC中易混淆的几个概念系列(一):初始化与关闭对话框
这个函数还销毁窗口的菜单,清空线程的消息队列,销毁与窗口过程相关的定时器,解除窗口对剪贴板的拥有权,打断剪贴板器的查看链。消息的时候,对话框及子控件还未创建完成,亦是说只是通知系统说要开始创建窗口啦,这个消息响应完之后,对话框和子控件才开始创建。VC中对于对话框的创建和关闭,消息的发送接收,往往涉及到很多函数,初学者往往很容易搞混,导致出现一些列问题,本系列文章针对这些概念进行区分,以更好的做好界面设计。,你可以给成员变量赋值,也可以修改窗口的基本内容比如风格,但是不能对窗口控件操作,因为窗口还没有建立。
2023-09-23 10:36:43 103
原创 Windows C++内存泄漏调试技术——系列3
写程序时经常会用到第三方模块和系统自带的模块,而这2种我们都是没有源码的,一旦发生内存泄漏,传统的日志排查法或一般的计数等手段好像都行不通了,这时候咋办?WinDbg只能监测两个时间点申请堆内存的变化量,并没有统计释放的堆内存,所以统计出来的结果中,排第一的并不一定是内存泄漏的项,还是需要结合代码进行过滤,这是个问题点。堆内存申请数量从高到低排序,每一项统计结果都有详细的函数调用堆栈,一般只需要分析使用量较高的前几项即可。最终会分析出使用堆内存的函数调用堆栈,为了方便查看函数调用堆栈的具体函数,需要设置。
2023-09-20 17:45:18 131
原创 C++ 深拷贝、浅拷贝
浅拷贝:可以理解为进行简单的拷贝,对于对象(Object)第一层的元素的属性值是基本类型的就相当于是基本类型的号运算,完全复制;对于第一层的元素的属性值是引用类型的相当于还是引用类型的号运算,这样子复制的还是引用类型的内存地址,而不是实体,所以还是会出现前后关联的问题;深拷贝:对于深拷贝,那就是可以理解为不管第几层,两者的关联都被剪断了,这前后两个变量没有任何关联,互不影响,相互独立。总的来说,两者主要的区别是:对于第一层的属性为引用类型数据进行复制的时候,复制的是数据的引用还是实例。
2023-09-14 21:46:59 135
MiniTool分区软件
2023-07-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人