自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 资源 (1)
  • 收藏
  • 关注

原创 恩培趣味计算机视觉-01-conda环境和Python库

第二步:在第一步创建的文件夹下(C:\Users\Administrator\pip)创建pip.ini文件。第一步: 在C:\Users\Administrator 目录下 创建pip文件夹。conda create --name 环境名称(英文) python=3.x。conda和pip都是国外服务器,下载很慢,需要更换为国内的源。conda remove --name 环境名称 --all。conda create --name 环境名称(英文)不指定python版本。指定python版本。

2026-10-19 20:20:26 179

原创 PixInsight入门教程-4-背景提取-工具使用

本教程基于B站大佬氪化金的视频教程制作,年龄大了,记不住了,唯有写的教程方便查看,如有需要,移步B站大佬主页,查看视频教程。

2026-10-12 22:44:40 71

原创 PixInsight入门教程-3-图像裁切和旋转

这张图中可以看到不可能每一张图的边缘叠加对齐都非常好,会导致脱线,所以PI内WBPP工具自动检测将脱线的部分裁切掉,在第一节的预处理中,我们会得到PI自动裁切的图片,以autocrop结尾的图片。我们看到之前叠加的M45,在其图片边缘位置可以看到,星点不是对齐的非常好,为了保证图片效果,我们势必需要对图片进行裁切,将图片的边缘星点脱线部分裁切掉。如果不使用自动裁切工具或者是直接从智能望远镜导入的fit文件,这边缘的瑕疵会影响你使用其他软件或者脚本处理的效果,所以必须二次裁切。在点击右下角拖动范围框。

2026-10-12 21:19:43 60

原创 PixInsight入门教程-2-STF工具与线性图像

点击它取消锁定,允许软件单独评估每一个通道的亮度。显示器的局限:你电脑显示器的屏幕能显示的亮度范围非常窄(大约 200-300 尼特),而你相机传感器记录下来的亮度范围(动态范围)极其宽广(可能有 16bit 即 65536 个亮度等级)。现象:此时画面虽然亮了,但因为还没有经过专业的色彩平衡校准,且三个通道的拉伸比例不同,画面通常会呈现出明显的偏色(偏绿/偏红),这属于正常现象。原理:在通道解锁的状态下,第二次点击“核弹”,软件会智能地以画面的“背景中性灰”为基准,自动平衡 R、G、B 三个通道的比例。

2026-10-12 21:19:29 205

原创 PixInsight入门教程-1-预处理

偏置场 (Bias)、暗场 (Dark)、平场 (Flat) 和亮场 (Light)。

2026-10-12 21:19:15 281

原创 LINUX系统-20-库制作与原理(二)-ELF文件分析

规定文件结构粒度更细,将文件的功能模块按照差异进行分类,有代码段、全局变量、只读数据、字符串变量等等数据,静态链接分析的时候一般关注的是链接视图,能够理解ELF文件中包含各个部分的差异。为了空间布局上的效率,在链接的时候,链接器会将不同目标文件(.o)中相同名称的节(Section)进行合并,但是合并后的节并不会直接被加载到内存,只是生成了二进制可执行程序。

2026-08-03 19:02:47 324

原创 LINUX系统-19-库制作与原理(一)

库是写好的、已经存在的、成熟的可以直接利用的代码。什么意思呢?库是写好的、成熟的、可以直接复用的代码集合。比如我想用 vector,只需要 #include ,编译器就会利用模板特性,在编译时自动帮我生成 vector 的底层实现代码。这让我无需重新造轮子,就能直接使用强大的数据结构。其本质上说库其实是一种可执行代码的二进制形式,可以被OS载入内存执行,库有2中形式:1、静态库,在linux中以.a结尾,在windows中以.lib结尾。

2026-08-03 19:02:36 160

原创 LINUX系统-18-EXT系列文件系统(三)

从这里可以看出几个问题:1、为什么需要 / 根目录?很显然,如果没有根目录,在OS进行路径解析的时候,就不知道从哪里开始了。就算是相对路径解析时进程提供的cwd,也是从根目录开始的。2、linux中为什么都会有家目录home?在这个目录下可以新建目录?其实本质就是在磁盘文件系统中,新建目录文件。而你新建的所有文件,都是在你或者系统指定的目录下新建的,这就是天然的路径。而linux文件系统本质上就是一颗多叉树!这个多叉树的根节点就是 根目录!

2026-06-03 23:30:45 291

原创 LINUX系统-17-EXT系列文件系统(二)

记录的信息有:分区内inode和blocks的重量,未使用的inode和block的数量,一个inode和block的大小,最近一次挂载的时间,最近一次写入数据的时间,如果super block的信息被破坏了,可以说整个文件系统都被破坏了。硬盘的每一个分区都是由数据块组成的,每一个块的大小在格式化的时候就被确定了,并且不能被更改,最常见的块大小是4KB,即8个扇区,4096 = 512 * 8,由8个扇区组成一个块,块是文件存取的最小单位。MBR(主引导记录):位于整块硬盘的最开头(第 0 扇区)。

2026-05-23 17:25:39 549

原创 LINUX系统-16-EXT系列文件系统(一)

上图就是一个盘面单面的具体结构,在盘面上有一圈一圈的磁道,从盘面外圈往内圈,最外侧的编号0、1、2以此类推,每一个磁道又被划分成了不同的扇区,就好像飞镖的标靶一样,具体的数据被写在了扇区上,盘面在旋转的过程中,磁头移动到具体的磁道上,读取磁道扇区上的数据。而磁头也是同进退的,所以在。2、上面右边这幅图中可以看出,因为单个盘面虽然可以在盘面的两面都进行数据的存储,但是单盘面的数据容量始终是有限的,如果需要扩大单个硬盘的容量,就需要对盘面进行堆叠,所以我们买到的大容量硬盘中,多数都是多盘面硬盘。

2026-05-23 17:25:26 378

原创 LINUX系统-15-基础IO(三)

需要强调的文件:1、open文件只是将磁盘上的文件和file结构体之间构成连接,不是加载。2、读取磁盘上的数据OS会将磁盘上的数据加载到页缓存,但写不会。3、write和read函数其本质都是拷贝函数。

2026-05-10 21:13:41 409

原创 LINUX系统-14-基础IO(二)

1、文件存储在磁盘里面,是永久性存储的2、linux下一切介文件。

2026-03-02 11:57:43 741

原创 LINUX系统-13-基础IO(一)

1、以不同模式打开文件流,读模式\写模式\追加模式打开文件流。2、进行读写文件操作。3、关闭文件流。

2026-03-02 11:57:37 585

原创 LINUX系统-11-进程控制(二)

函数的第3~N-1个参数为这个程序的可变参数,例如 ls是将要被执行的替换程序,那么-a,-l就是他的可变参数,类型同样是const char*,所以可以传递多个字符串,例如"-a",“-l”。函数的第3~N-2个参数为这个程序的可变参数,例如 ls是将要被执行的替换程序,那么-a,-l就是他的可变参数,类型同样是const char*,所以可以传递多个字符串,例如"-a",“-l”。初一看对于ls命令来说,修改ls进程本身的这两个环境变量值,并没有什么意义,但是对于后面的学习来说非常重要。

2026-02-24 10:13:44 706

原创 LINUX系统-12-进程控制(三)-自定义shell

假如现在我们需要解析“ls -a -l”,需要将其解析为“ls”“-a”“-l”,换句话说就是需要用空格分割字符串,我们可以使用 strtok进行分割。这是 fgets 最显著的特征。之前我们通过fgets读取到的是一行字符串,这一行字符串大大小取决于缓冲区的大小,然后我们得到了一个中间带有各种符号的字符串。读取了 n-1 个字符:为了防止缓冲区溢出,当读取到 n-1 个字符时,函数会停止,并自动在末尾添加 \0。注意:换行符\n会被包含在读取的结果字符串中。因此,字符串的结尾是 \n\0,而不是 \0。

2026-02-24 10:13:39 640

原创 LINUX系统-10-进程控制(一)

退出码(退出状态)可以告诉我们最后一次执行的命令的状态,在命令结束以后,我们可以知道命令是成功完成还是以错误结束,其基本思想是程序返回代码为0的时候,没有问题,代码是1 或 0以外的任何代码都被视为不成功。命令正确返回 0int main()// 程序代码return 0;命令错误返回 1int main()// 程序代码return 1;什么叫阻塞式等待,其实就是父进程什么都不干,一直在傻傻等着子进程运行结束,然后接受子进程的退出码。

2026-02-02 14:49:41 680

原创 LINUX系统-09-程序地址空间

通过程序的现象可以看出,在fork以后,父进程和子进程都有自己的g_val,父进程和子进程的g_val的地址却是一样的,但是g_val的值却不一样。学过进程都知道,子进程会共享父进程的代码和数据,之前我们写的这个例子很小,代码和数据都很小,如果给子进程真实开辟一块物理内存,并不影响什么,但是如果父进程很大,光数据就占用了512mb内存,父进程一下开了3个子进程,且继承了父进程的数据,直接在物理内存上开辟3块区域也,那1.5G的内存就没有了,而且他们的数据却是一样的,纯粹浪费资源!

2026-02-02 14:49:19 724

原创 LINUX系统-08-环境变量(二)

我们在初始bash下新建了一个bash,然后修改新建的这个bash的环境变量,查看新建的环境变量,发现除去我们新添加的那行NEWENV其他的环境变量全部继承至初始bash,这是所谓的父传子,也是fork时的复制机制导致的。在之前的进程学习中我们可以知道,父进程可以继承父进程数据和代码,所以也可以获得bash的环境变量,但是我们修改子进程的数据和代码,不会影响父进程的数据和代码,或者说,我们修改子进程的环境变量,不会影响父进程的环境变量。这些变量在你的 .bashrc 里是找不到的,因为它们是系统自带的。

2026-01-28 13:50:30 1231 1

原创 LINUX系统-07-环境变量(一)

在windows11系统下,路径系统-> 系统信息 -> 高级系统设置 -> 环境变量 中可以看到windows的环境变量分为系统环境变量和用户环境变量它们的区别主要在于作用域的不同系统环境变量是给所有用户使用的,对这台电脑上所有用户都生效。而用户变量是给用户自己使用的,只对当前登录的这个账户生效。PATH 是最常被修改的环境变量(用来告诉系统去哪里找程序)。当用户变量和系统变量中都包含 PATH 时,Windows 的查找逻辑如下:先查找系统变量中的 PATH 路径。

2026-01-28 13:50:16 951

原创 LINUX系统-06-进程(四)

因为CPU资源分配的先后顺序,就是指进程的优先级(priority)优先权高的进程有优先执行的权利。配置进程优先级对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样以来,把不重要的进程安排到某个CPU,可以大大改善系统整体的性能。

2026-01-20 10:51:55 563

原创 LINUX系统-05-进程(三)

首先这是一个静态数组,由static修饰,也改变了这个数组变量的连接属性为内部链接属性。*号左边有const代表 这个task_state_array指针不能被修改,具有常性号邮编有const代表 这个task_state_array指针指向的内容不能被修改,具有常性char代表中是一个字符数组task_state_array是数组的名字当 Linux 内核完成自身的初始化后(比如内存管理、CPU 调度、驱动加载等),它会创建第一个用户态进程。

2026-01-20 10:51:48 807

原创 LINUX系统-04-进程(二)

1、程序或者可执行文件本质是都是磁盘上一个文件,他们是一回事,当程序或者可执行文件被加载到内存中运行时,就叫做进程操作系统同时运行很多程序,每一个程序都加载到内存,即OS内运行了很多进程,在启动计算机后,第一个运行的程序就是操作系统,而内存中的进程被操作系统管理起来。2、套用面上的例子,操作系统先描述进程,在组织进程,此时必然存在一个struct结构体,描述进程的属性,属性中有一个next指针指向下一个进程,组成一个链表或者其他数据结构去维护进程。

2026-01-19 11:54:03 953

原创 LINUX系统-03-进程(一)

操作系统是管理计算机硬件与软件资源,为用户和应用程序提供交互接口与运行环境的系统软件。为什么要有操作系统?1、操作系统要把软硬件资源管理好。2、给用户(人)提供良好的使用环境。任何计算机系统都包括一个基本的程序集合,称为操作系统(OS)笼统的理解,操作系统包括:1、内核(进程管理、内存关系、文件管理)2、其他程序:库函数、shell程序等在这张图的中部,有一个system call(系统调用)

2026-01-19 11:53:58 773

原创 LINUX系统-01-权限

在linux中可以做任何事情,不受限制在linux中可以做有限的事情1、目录的可执行权限决定了你是否可以在目录下执行命令。2、如果目录没有x权限,则无法对目录执行任何命令,甚至无法cd进入目录,即使目录有-r读权限(这个地方容易犯浑,认为有读权限就能进入目录读取目录下的文件)3、如果目录具有x权限,但没有r权限,则用户可以执行命令,可以cd进入目录,但是不能ls目录。

2026-01-12 19:10:24 458

原创 LINUX系统-02-动静态库

在之前说gcc编译的过程中,gcc分步执行的倒数第二步 gcc -c code.s -o code.o,会生成链接文件xxx.o,即每一个独立的.c文件会生成一个.o文件,.o 文件是源代码到可执行文件的中间产物,它将人类可读的代码转换为机器可识别的二进制形式,同时保留了模块间依赖的关键信息,是模块化开发和高效编译的基础。所谓静态库看之前的例子已经明白了,其实就是把程序运行时需要的所有库文件的代码全部加入到可执行文件中,新词生成的文件比较大,但在运行时,也就不需要库文件了,在linux下,其后缀一般为。

2026-01-12 19:10:14 1017

原创 STM32教程-03-STM32总线矩阵、系统框图、存储器映射

功能:从存储器(Flash的常量或者RAM的变量)中读取内核专属的数据特点:1、单向传输,仅从存储器到内核的读操作,不支持从内核写到存储器2、与Flash的DCODE总线,CCMRAM直接对接,不经过总线矩阵,没有总线竞争与延迟3、仅服务内核,DMA 等其他主设备无法访问其路径。功能:实现内核与外设的双向交互,相比上面2个总线,s总线是可读可写的特点:1、双向传输(支持 “内核→外设 / 存储” 写操作、“外设 / 存储→内核” 读操作);

2026-01-04 19:42:04 1756

原创 STM32教程-02-STM32复习C语言

按位与 & :两位都为 1 时结果为 1,否则为 00000 1101&1111 1100——————————0000 1100按位取反 ~:将每一位的 0 变成 1,1 变成 0只要有一个位为 1,结果就为 10000 1101|1111 1100——————————1111 1101按位异或 ^ :两位不同则为 1,相同则为 00000 1101^1111 1100——————————1111 0001左移指令 : 高位溢出舍弃,低位补 0。0x01 << 3。

2025-12-29 11:47:04 790

原创 STM32教程-01-STM32调试步骤

该图标下面有 6 个选项(下拉选择),我们一般用第一个,也就是逻辑分析窗口(Logic Analyzer),点击即可调出该窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。MDK5 提供 2 个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。:通过该按钮,显示调用关系&局部变量窗口,显示当前函数的调用关系和局部变量,方便查看,对分析程序非常有用。

2025-12-23 10:16:58 900

原创 ESP32-Arduino基础-01-GPIO

在微控制器中,GPIO是最常用的外设,即通用输入输出端口GPIO用于写入和读取引脚状态,有的被复用为ADC等等功能。// pin 为数字引脚编号// 比如0 表示GPIO0, 1表示GPIO1// mode 为数字引脚的工作模式// 常用的有// OUTPUT 输出模式// INPUT 输入模式// INPUT_PULLUP 带内部上拉的输入模式// INPUT_PULLDOWN 带内部下拉的输入模式例如:将GPIO1设置为输出模式将GPIO1设置为带内部上拉的输入模式。

2025-12-21 18:05:34 1178

原创 C++ STL之vector类

回顾函数重载x = y;y = tmp;x = y;y = tmp;这段代码展示了 C++ 中的函数重载特性:我们定义了两个swap函数,分别用于交换int类型和float类型的变量。当我们在main函数中传入int类型的x1和y1时,编译器会自动匹配到参数为int&的swap函数;而传入float类型的x2和y2时,则会匹配到参数为float&的版本,从而实现了不同类型变量的交换操作。这里我们使用了 C++中函数重载的特性。

2025-08-25 17:04:36 835

原创 C++手撕vector类代码

此时 pos 虽然还指向原来的内存位置(&v1 [1]),但该位置的元素已经变成了 3——迭代器的 “语义目标”(元素 2)失效了,与你最初的意图完全不符。在常见实现(如 GCC、MSVC)里,vector 迭代器默认直接用 T* 实现,但为了兼容模板、const 语义等,实际会通过 typedef 或嵌套类型封装,本质仍是对指针的 “语义化重命名”。而insert函数会因为扩容,扩容后,形参pos迭代器位置、_start、_finish、_end_of_storage,都不再是之前的数据了。

2025-08-25 17:04:29 1057

原创 C++手撕string类代码

1、_str指针变量:因为是不带参数的默认构造函数,成员变量由构造函数本身通过初始化列表进行初始化,如果对指针变量_str赋给nullptr后,构造函数本身没有问题,但是_str就指向的一个空指针,后续操作带来一系列的问题,所以我们需要将其初始化,通过new一个字节新的char地址,并存放\0,使_str指向一个真正意义的地址,避免后续使用_str指针出现空指针解引用的问题。因为C++ 中类成员变量的初始化顺序由声明顺序决定,而非初始化列表中的顺序,所以必须将成员变量_size的声明放在最前面?

2025-06-30 21:33:50 908

原创 C++ STL之string类

为什么:C++ 标准库中的所有组件(包括string类)都被放置在std命名空间中。int main()// 正确写法,string在std命名空间中// 错误写法,未指定命名空间return 0;

2025-06-30 21:33:45 1283

原创 C++内存管理

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。使用格式:new (place_address) type或者new(place_address) type(initializer - list)place_address必须是一个指针,initializer - list是类型的初始化列表使用场景:定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。

2025-06-09 21:43:35 1235

原创 C++模版初阶

函数模版函数模版代表了一个函数家族,该函数模版与类型无关,在使用时被实例化,根据实参类型产生函数的特定类型版本函数模版格式返回值类型 函数名(参数列表){}函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。

2025-06-09 21:43:28 551

原创 C++类和对象(下)

尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表。如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。如果你没有给缺省值,对于没有显式在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显式在初始化列表初始化的⾃定义类型成员会调⽤这个成员类型的默认构造函数,如果没有默认构造会编译错误。无论是否显示写初始化列表,每个构造函数都有其初始化列表无论是否在初始化列表显式初始化成员变量,每个成员变量都要走初始化列表。

2025-05-29 01:15:44 680 2

原创 C++ 类和对象(中)

构造函数:用于初始化对象的成员变量,确保对象在创建时就处于一个合理的初始状态。它的函数名与类名相同,没有返回值。构造函数的本质是要替代我们以前Stack和Date类中写的Init函数的功能,构造函数⾃动调⽤的特点就完美的替代的了Init。

2025-05-19 20:47:25 1023

原创 C++基础

命名空间能够将代码组织到不同的作用域中,从而避免此类冲突。在main函数中,我们需要指定输出的变量rand为命名空间Rand中的变量时,需要在printf(“%d\n”, Rand::rand);解决方法:定义一个新的命名空间,让这个命名空间包含rand这个变量,使rand的变量的作用域在Rand命名空间中,编译器就知道rand是一个变量,而不是生成随机数的函数了。但是在C++中可以使用默认缺省参数这个方法,给函数一个缺省参数,如果函数的实参少了一个参数,仍然可以使用函数的默认缺省参数,将函数运行起来。

2025-05-11 23:42:57 451

原创 C++ 类和对象(上)

在C++中,类是一种用户定义的数据类型,用于封装数据和对数据的操作。类可以包含数据成员(变量)和成员函数(方法),这些成员可以是公有的、私有的或受保护的,以控制对类成员的访问。先看一段程序class Datapublic:_day = day;private:// 为了区分成员变量,⼀般习惯上成员变量// 会加⼀个特殊标识,如_ 或者 m 开头int _year;int _month;int _day;这里我们写了一个日期类。

2025-05-11 23:42:42 1014

原创 C++基础-引用

变量本身和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋 ⻛";引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间。这里先看一段传址与传引用的例子,因为使用了函数重载,所以两个swap函数因为形参不同,所以可以同时存在。这2个简单的例子都说明了传引用调用的便捷之处,减少了传地址调用后,程序更容易理解了。再看引用的第二种大的用法,被调函数返回堆区变量别名,而不是返回变量的拷贝。引用的第一个大的用法,做为形参,减少使用传地址调用。

2025-04-21 00:58:34 201

PIC单片机使用教程-基础篇.pdf

PIC单片机使用教程-基础篇.pdf microchip 大学计划用书

2012-05-20

空空如也

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

TA关注的人

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