- 博客(40)
- 收藏
- 关注
原创 Day 14:仿射变换与三个对应点
二维仿射变换的表达式为:其中,六个参数组成一个 2×3 矩阵:将公式展开:不同的参数组合能实现不同变换。变换对应矩阵直观效果平移整体移动缩放改变宽度、高度旋转在图像坐标系中按角度旋转水平剪切矩形倾斜为平行四边形要注意:矩阵中的a,b,c,d是共同决定变换的,不能简单地说a一定是缩放、b一定是旋转。只有在特定矩阵形式下,这些参数才有直接对应的解释。obsidian。
2026-11-05 20:06:14
134
原创 Day 12:轮廓法与连通域法对比实验
今天实验结束后,你可以形成下面这样的工程判断。情况一:主要研究叶片形状、区域边缘或周长。优先使用,因为它直接提供边界点序列,方便计算轮廓几何特征。情况二:主要研究区域编号、像素面积、区域质心及面积过滤。优先使用,因为它直接提供所需的统计量,而且可以通过labels查询每个像素所属的区域。情况三:需要分析苗行中的植株中心点和形状。可以将两种方法组合:先利用连通域提取候选区域及质心,再根据需要提取轮廓形状特征。不过仍应注意区域不一定与单株一一对应。
2026-11-05 19:45:31
17
原创 Day 8:Canny边缘检测
obsidian已经学习了 Sobel 算子,知道如何计算图像在 X、Y 两个方向上的灰度梯度。今天我们就要解决一个更进一步的问题:既然 Sobel 已经能找到灰度变化明显的位置,为什么还需要 Canny?核心原因是:Sobel 计算的是梯度响应,而 Canny 会进一步筛选、细化和连接边缘,最终生成更适合后续处理的二值边缘图。今天我们主要完成四件事:理解 Canny 的四个步骤、掌握双阈值与滞后连接、完成农田图像对比实验,以及弄清楚 Canny 与 Sobel 的关系。obsidian。
2026-10-31 10:57:21
167
原创 Day 6:均值滤波、高斯滤波和中值滤波
你可以先把图像噪声理解为:图像中不希望出现的随机数值变化,它们可能干扰真实目标的颜色、纹理或边缘。98 105 9596 103 99中间的 180 与周围明显不同,可能就是噪声。实际拍摄中,噪声可能来自传感器、电路、低照度、高 ISO 等因素。图像压缩也可能引入伪影,但不一定属于随机噪声。
2026-10-30 15:02:58
84
原创 第四周第五天——重构成类
const;const不是修饰outputPath。才是修饰参数。) const这个成员函数承诺不修改当前 ImageProcessor 对象的状态。
2026-10-27 15:39:00
205
原创 第四周第四天——轮廓提取与面积过滤
你可能觉得:图像都是整数像素,为什么面积不是 int?因为轮廓是由点和几何边界计算得到的,面积结果不一定必须是整数。更合理。
2026-10-25 10:29:45
494
原创 第四周第三天——形态学处理
形态学操作不能凭空决定:到底多大范围算“附近”。kernel也叫:结构元素。意思可以先理解成:创建一个 5×5 的小窗口,形态学处理时用它在图像上滑动判断。膨胀↓腐蚀mask,closed,kernel填补白色目标内部的小黑洞、连接距离很近的白色区域。
2026-10-24 10:06:13
161
原创 第三周第五天——cmake工程结构
target→ CMake 要构建的一个目标app也是 target。给某个 target 配置东西。main.cpp││ #include▼││ 声明▼“知道 process() 存在”││ 定义▼“process() 真正怎么运行”CMake↓知道要编译哪些 .cpp↓知道去哪里找 .h这两个职责一定分开。
2026-10-19 10:56:01
252
原创 第三周第四天——cmake
东西作用.cppC++ 源代码g++真正编译/链接代码描述项目怎么构建CMake根据配置生成并管理构建系统再加一个:make| 按照生成的构建规则执行实际构建 |↓CMake↓Makefile↓make↓g++↓app这是一种典型情况。
2026-10-17 14:18:20
146
原创 第三周第二天——Linux环境操作
你可以把环境变量理解成:当前 shell 给程序提供的一组“环境配置”。echo $PATH表示:取这个变量的值。echo $HOME/home/user││ │ │▼ ▼ ▼进程管理 环境变量 远程操作kill which│ │ │▼ ▼ ▼谁在运行?调用哪个程序?操作哪台机器?ps看谁在运行,PID 是进程编号。PATH决定系统去哪里找可执行程序,which告诉你最终找到了谁。export给当前 shell 及其子进程设置环境变量。
2026-10-16 19:36:15
224
原创 第二周第六天——智能指针
unique_ptr一个所有者│▼Object所有者死亡↓Object 自动死亡shared_ptrp1 ──┐p2 ──┘最后一个拥有者死亡↓Object 自动死亡weak_ptr只观察不负责让 Object 活着。
2026-10-15 19:36:09
97
原创 第二周第五天——队列与lamda
是:最大的优先。Detection就需要告诉它:什么样的 Detection 优先级更高?confidence判断。比较函数lambda自定义比较器所以你今天学 lambda,其实也在给后面的自定义铺路。内容核心思想CV/算法场景queueFIFOBFS、连通区域搜索高优先级先出Top-K、优先处理高置信度目标lambda临时匿名函数排序、过滤、比较规则[=]按值捕获读取外部配置[&]按引用捕获修改外部状态queue解决“按到达顺序处理谁”。解决“当前谁最值得优先处理”。
2026-10-15 19:28:05
110
原创 第二周第三天——类的特性
public:它就是:抽象类。Detector d;因为这个类根本没有完整的detect()实现。Detector不是具体的检测器它只是“检测器这个概念”就像现实里:“动物”是一个抽象类别。猫狗鸟Detector。
2026-10-14 10:05:24
81
原创 第二周第二天——构造函数与析构函数
File 对象出生↓打开文件File 对象死亡↓关闭文件Lock 对象出生↓加锁Lock 对象死亡↓自动解锁以后你会发现:C++ 很多“自动资源管理”的核心,就是利用析构函数。
2026-10-13 16:03:09
609
原创 第二周第一天——类
class Crop不是创建了一个具体作物。而是在告诉编译器:我要定义一种新的类型,它叫Crop。intdouble有点类似。int是 C++ 已经给你准备好的类型。Crop是你自己定义的类型。namecount叫做:成员变量 member variables。Crop类的成员。以后你还会看到一个名字:也是类似意思。Crop crop;
2026-10-13 15:57:43
149
原创 第一周第四天——指针
int a = 10;int* p意思是:创建一个变量p,它的类型是int*。int*用于保存 int 类型变量地址的数据类型。p = &a;意思是:把a的地址存进p。整句话就是:创建一个指向int的指针p,让它保存变量a的地址。
2026-10-09 10:38:07
303
原创 第一周第二天——C++基本语法
return 0;#include函数main通常会报错,因为程序执行到main()时还不知道add是什么。以后会学:函数声明。但今天先不用展开。
2026-10-08 20:30:14
270
原创 DINO-YOLO离线下载模型
当我按照DINO-YOLO代码作者要求在服务器上安装环境并使用运行指令运行时,发现会老是试图连接https://huggingface.co/facebook/dinov3-vitb16-pretrain-lvd1689m去下载DINOv3模型,但我的服务器一直连接不到这个网站,并重复连接多次后报错。
2026-01-12 15:15:23
652
原创 DINOv3对自己的数据集进行自监督对比学习训练
1. 训练和评估代码需要 PyTorch 版本 >= 2.7.1 ,并且需要 Linux 环境。2. 我用的python版本是3.113. 按照官网给出的requirements.txt文件安装其他的第三方包。
2025-12-14 21:20:22
914
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅