- 博客(46)
- 收藏
- 关注
原创 使用c#制作一个小型桌面程序
创建.NET Framework新项目,将之前生成的dll放在Demo文件夹的bin ->debug或是 release中(看你自己用的什么模式),创建完成后 系统会自动生成一些文件,其中 pch.cpp 先不要修改,pch.h中先导入自己需要用到的库,下面是我的代码。布局完了之后会自动生成Form1.Designer.cs 的窗口设计代码,点击控件按F4 还可以修改他们的属性。完成之后点击生成 就可以在bin中出现的你的.exe文件咯,是不是很简单呀~[狗头]我们还需要一个入口主程序。
2024-09-14 17:02:52 3426
原创 c++多态、数据抽象、数据封装(一)
可以看到上面的代码中 通过虚函数实现了动态链接的操作,虚函数是在基类中使用关键字 virtual 声明的函数。您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。数据封装是指将对象的属性(数据)和方法(操作)绑定在一起,对外隐藏对象的内部状态,只允许通过对象的方法来访问和修改内部数据。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。
2024-09-09 16:38:06 400
原创 从零开始学习SLAM六(单应矩阵)
如果一个平面上的点集经过某种变换后,在另一个平面上形成的新点集仍然保持原来的线性特性(如共线的点仍然共线),那么这种变换就称为单应性变换。平面方程:在讨论单应矩阵时提到的平面方程,通常指的是图像中的某个平面在三维空间中的方程。具体来说,当我们在处理单应矩阵时,我们关注的是两个图像之间对应点的关系,这些点通常位于同一个平面上。x+d=0中的x = (X,Y, Z)指的是三维世界坐标系中的点,世界坐标系是一个固定的参考坐标系,用于描述三维空间中的物体位置和方向。H矩阵的两边是两张图像对应的匹配点对。
2024-08-26 13:43:06 844
原创 从零开始学习Slam(四)
1、首先,世界坐标系下有一个三维点Pw2、若世界坐标系到相机坐标系下的变换为旋转矩阵 R 和平移向量t 组成的变换矩阵 T,那么Pw在相机坐标系下的坐标为 Pc = R * Pw + t = T * Pw3、此时的Pc三个分量分别是X, Y, Z,我们需要把它投影到归一化平面Z=1上,这样我们得到了相机坐标系下Pc的归一化坐标 Pc’ = (X/Z, Y/Z, 1)4、用内参矩阵乘以归一化坐标就得到了像素坐标 Puv = K*Pc’
2024-08-15 14:47:55 1074
原创 c++ 引用
当返回一个引用时,要注意被引用的对象不能超出作用域。所以返回一个对局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用。通过使用引用来替代指针,会使 C++ 程序更容易阅读和维护。C++ 函数可以返回一个引用,方式与返回一个指针类似。一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。当函数返回一个引用时,则返回一个指向返回值的隐式指针。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。所以说引用变量是一个别名,也就是说,它是。
2024-08-12 19:43:44 387
原创 c++结构
为了定义结构,您必须使用struct语句。...type_name是结构体类型的名称,是标准的变量定义,比如int i;或者float f;或者其他有效的变量定义。在结构定义的末尾,最后一个分号之前,您可以指定一个或多个结构变量,这是可选的。下面是声明一个结构体类型Books,变量为book。
2024-08-09 16:55:48 230
原创 c++ 友元函数
友元函数(Friend function)是指在 C++ 中可以访问类的私有成员(私有变量和私有函数)的非成员函数或者其他类的成员函数。具体来说,友元函数并不是类的成员函数,但却能够访问类的所有成员,包括私有成员。访问控制:虽然友元函数可以访问类的私有成员,但这并不意味着所有的函数都应该声明为友元函数。友元函数破坏了封装性原则,因此应当谨慎使用,仅在确实需要访问私有成员而无法通过公有接口实现时才使用。设计考虑:在设计类时,尽量通过成员函数和成员变量的公有接口来操作对象的状态,避免过多地使用友元函数。
2024-08-01 13:42:17 354 1
原创 c++ 拷贝构造函数
拷贝构造函数的默认生成:如果你没有显式地提供拷贝构造函数的定义,C++ 会为你生成一个默认的拷贝构造函数。这里 obj2 将会通过 obj1 的拷贝构造函数被初始化。拷贝构造函数是一个特殊的构造函数,其参数是同类型的引用,并且用于初始化一个对象,这个对象是传递给它的同类型对象的副本。在这个例子中,当 obj2 通过 obj1 的拷贝构造函数初始化时,拷贝构造函数会被调用,输出 “拷贝构造函数被调用”。以值传递的方式传递对象给函数:如果函数参数是按值传递的,并且参数类型是类类型,那么拷贝构造函数将会被调用。
2024-07-30 15:26:06 512
原创 注意力机制(三)- 空间注意力机制
空间注意力的核心思想是让模型能够聚焦于输入数据中最重要的空间区域关注区域:空间注意力机制使模型能够识别并关注输入图像或文本中的关键区域。权重分配:通过学习一个权重分布,模型可以为输入数据的每个空间位置分配不同的重要性。这些权重通常通过一个神经网络层(如卷积层或全连接层)生成,并经过激活函数(如Softmax)处理,以确保权重之和为1。
2024-07-27 20:26:17 980
原创 c++类访问修饰符
本文参考,个人笔记用。数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。(在类里面不写是什么类型,默认是 private 的,如果继承时不显示声明是 private,protected,public 继承,则默认是 private 继承)。另外,。
2024-07-24 19:58:20 609
原创 c++ 线程安全与线程管理
C++11引入了标准库中的多线程支持,包括std::thread类和各种同步机制互斥锁std::mutex : 互斥锁用于保护共享资源,确保同一时间只有一个线程能够访问该资源,以防止数据竞争。条件变量std::condition_variable : 条件变量用于线程之间的通信,允许一个或多个线程等待某个条件(或者事件)的发生,而另一个线程则可以通知这些等待的线程该条件已经满足。原子操作std::atomic : 原子操作用于无锁编程,提供对基本数据类型的原子读写操作,防止数据竞争而无需显式的锁机制。
2024-06-25 18:24:20 533
原创 c++字典
如果更关注性能且不需要有序性,可以选择std::unordered_map。在C++中,“字典”通常指的是std::map或std::unordered_map,它们是标准库中提供的关联容器,用于存储键值对。std::unordered_map:键值对无序,但查找、插入和删除速度更快,适用于不需要顺序的场景。例如,如果你需要按字母顺序遍历元素。使用 std::map std::map 是一种有序的关联容器,键值对按键排序。使用 std::unordered_map std::unordered_map。
2024-06-24 17:24:49 907
原创 c++ 矩阵应用
选择适当的场景:固定大小的矩阵:如果矩阵的大小在编译时已知且不会变化,使用二维数组可能更合适,因为它更简单和直接。动态大小的矩阵:如果矩阵的大小需要在运行时动态调整,或者需要使用std::vector提供的其他灵活性和算法支持,那么std::vector更适合,尽管在性能上可能会稍有损失。性能要求:如果性能是关键问题,尤其是对于大型数据集和复杂的数学运算,可以考虑使用专门的线性代数库如Eigen或Armadillo,它们在性能和功能上都有优势。
2024-06-17 21:00:11 1027
原创 从零开始学习Slam-旋转矩阵&旋转向量&四元组(二)
本文参考:计算机视觉life 仅作笔记用书接上回,上回不清不楚的介绍了旋转矩阵&旋转向量和四元组现在回顾一下重点:本着绕谁谁不变的变则假设绕z轴旋转θ,旋转矩阵为:再回顾一下旋转向量的表示以及这个基本记不住的罗德里格斯公式,记不住也没事:已知旋转矩阵定义是沿着Z轴旋转45°。请按照该定义初始化旋转向量、旋转矩阵、四元数、欧拉角。请编程实现:1、以上四种表达方式的相互转换关系并输出,并参考给出的结果验证是否正确。2、假设平移向量为(1,2,3),请输出旋转矩阵和该平移矩阵构成的欧式变换矩阵,并根
2024-05-31 17:49:25 380 1
原创 注意力机制原理
注意力机制最早是由神经科学家 Donald Olding Hebb 在 1949 年提出的。Hebb 观察到,大脑中的突触连接强度会随着两个神经元的活动的相互关联性而增强。他提出了“细胞之间的联结,就是心理之间的联结”的著名原则,即被称为“赫布学习规则”。在深度学习领域,注意力机制在 2014 年由 Bahdanau 等人首次引入到神经网络机器翻译模型中,这种模型也被称为“注意力机制编码器-解码器模型”。
2024-05-30 14:32:14 897 2
原创 with关键字
在 PyTorch 中,torch.no_grad() 返回一个上下文管理器,当使用 with torch.no_grad(): 语句时,PyTorch 会在进入 with 代码块时禁用梯度计算,并在退出代码块时重新启用梯度计算(如果之前已经启用)。在这个例子中,with torch.no_grad(): 创建了一个上下文,在该上下文中梯度计算被禁用。在这个示例中,with torch.no_grad(): 创建了一个上下文管理器,在这个代码块内执行的所有操作都不会计算梯度。() 方法来实现的。
2024-05-24 15:50:45 357
原创 小波变换衡量信号相似度
最近做纸币防伪的水印防伪这一块,了解了少量小波变换的知识,本篇文章专业性差,仅作为笔记使用Ψ (x)是小波函数python 的 PyWavelets(pywt)库中,
2024-05-14 18:05:02 354
原创 金山面试总结
C++ 的三大特性通常指的是封装、继承和多态。这三个特性是面向对象编程中的基本概念,这三个特性共同构成了面向对象编程的基础,它们使得代码更加模块化、可扩展和易于维护。封装(Encapsulation):封装是将数据和操作数据的方法(即函数)捆绑在一起的机制。通过封装,对象的内部细节被隐藏,只暴露出公共的接口供外部使用。这种方式可以保护数据不被直接访问和修改,提高代码的安全性和可维护性。
2024-04-16 18:19:42 899 2
原创 从零开始学习Slam-旋转矩阵&旋转向量&四元组
旋转矩阵的概念,参考一个在这里 二维向量p 逆时针旋转θ的旋转矩阵为cosθsinθ−sinθcosθ。
2024-04-07 10:42:21 1057
原创 yolov5 - 生成动态库
作为刚学习动态库的新手抑或是c++还未入门的菜狗(Me)来说,Linux入门简单,无需复杂操作,因为Linux下gcc编译的执行文件默认是ELF格式,无需初始化入口,也无需对函数做特别声明,编写方便。
2024-03-26 11:25:50 559 2
原创 YoloV5 原文理解&工程实践(一)
在 YOLOv5 中,“Focus” 是一种特殊的卷积层,用于替代传统的下采样操作。它的作用是在减少特征图的尺寸的同时,更好地保留物体的细节和小尺寸目标。Focus 层可以采用切片操作把特征图拆分成多个块,采用隔列采样+通道拼接,从而实现特征图的下采样。这种方式有助于增强网络对小目标的感知能力,并提高目标检测的准确性。(如下图)return p# 采用隔项切片操作 特征图由(b,c,w,h) ->(b,4c,w/2,h/2)
2024-02-27 20:09:12 1361 1
原创 从零开始学习SLAM(即时定位与地图创建)-齐次坐标
齐次坐标是一种在计算机图形学和几何代数中常用的表示方法。它是一种将欧几里德空间中的点和向量统一起来的方法。使用齐次坐标可以简化对点和向量的运算,例如平移、旋转和投影等操作。此外,齐次坐标还可以方便地表示无穷远点和方向向量,从而更灵活地描述几何变换和投影。在二维空间中,一个点 (x, y) 可以使用齐次坐标表示为 (x, y, 1),一个向量 (a, b) 可以表示为 (a, b, 0)。
2024-02-26 18:12:31 1142 2
原创 c++ tuple
C++11 引入了一个新的标准库类型 std::tuple,它代表一个包含多个值的元组。我们可以使用 std::get 函数来获取元组中的值,或者使用 std::tie 函数将元组中的值一次性分配给对应的变量。我们可以在定义时指定该元组包含的值的类型,也可以在创建时初始化元组的值。std::get 的第一个参数是要访问的元组中的值的索引,从 0 开始计数。另外,对于一个元组中的值的类型,我们也可以使用 auto 关键字来自动推断。当使用 std::tie 时,我们可以将多个值一次性分配给对应的变量。
2024-02-04 16:55:27 455 2
原创 解压不同压缩包命令
首先需要安装p7zip-full软件包:sudo apt-get install p7zip-full。首先需要安装rar工具:sudo apt-get install rar。
2023-12-06 10:08:54 125 1
原创 Ubuntu 连不上网【已解决】
有时候,重启网络服务可以帮助恢复到默认的网络连接。你可以通过VPN客户端软件断开连接,或者在终端中使用相应的命令来停止VPN服务。尝试了搜索到的n种方法 ,改成桥接模式,设置DNS什么的,都没见效,通过。查看ip,发现连上了vpn的ip地址。修改ip地址即可解决。在系统的网络设置中检查VPN配置,并确保没有设置为自动连接。
2023-12-05 16:41:35 953 1
原创 C++ Lambda表达式
lambda函数的运用有时起到了简化代码量的作用,避免了单独的声明与定义,但会产生额外的算力开销,在实际开发中,我们可以根据具体情况权衡利弊,选择偏好的编程风格。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。Lambda表达式的限定符值为mutable,其意义是可以在函数体内修改按值捕获的变量;值捕获:将外部变量以const引用的方式传递到Lambda表达式中,在表达式中。),并返回他们的和,返回值的类型为lambda函数自动推断的返回类型。
2023-10-11 16:13:26 121
原创 指针数组的解释
变量 str 存储的是指向字符串第一个字符的指针,即字符串的起始地址。两个例子中:第一种赋值方式是将数组元素的地址赋给指针数组的元素,第二种赋值方式直接将字符串常量的地址赋给指针数组的元素。由于指针数组 names 的元素是指向字符串常量的指针,因此 *names[i] 实际上获取了每个字符串的第一个字符。这里的names[i]是指针,指向了字符串常量,cout 将根据指针所指向的内存地址输出字符串的内容。这个数组有三个元素,每个元素都是一个 int* 类型的指针,可以分别指向一个 int 类型的变量。
2023-10-08 17:23:31 142 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人