我的毕业课题需要在零件图片上做注意机制(视觉显著性)实验,用的工具箱是 Caltech 的 SaliencyToolbox(Itti–Koch 模型,MATLAB 实现,2006–2013)。但我装的 MATLAB R2025b 和这个老工具箱不兼容,根本跑不起来。于是我用 C++(MSVC x64)把工具箱的默认处理路径逐行复刻了一遍,约 2000 行,脱离了 MATLAB 环境,还顺手把课题下一步要用的 top-down 模板匹配也做了。本文记录这件事的来龙去脉、模型原理、实现中的坑和最终效果。
静态逆向实战:不运行一步,看穿《雷电 III》PC 版的底细
/MT 与 /MD:CRT 链接选项、跨模块堆损坏与 C++ ABI 一致性
Windows DLL 注入技术全景:七种方式一张图
Windows Hook 入门:局部钩子与远程钩子,兼全局键盘钩子实战
Windows TLS(线程局部存储):同一个变量名,每个线程各一份
MATLAB 数字图像处理笔记
使用 MATLAB 图像处理工具箱做程序设计相对简单,本文通过几个可运行的小例子,梳理图像处理的常见技术:图像读写、颜色空间、直方图及均衡化、平滑滤波、边缘检测、二值化、降噪与形态学操作,帮助建立这方面的技能体系。原文写于 2018 年,首发于博客园,现迁移到本博客。
Windows DLL 三种加载方式:隐式、显式、延迟加载到底差在哪
C++ 并发编程笔记:join/detach 与 future/promise 两个最基础的模型
C++ 对象模型实战(八):对象模型不是语言规定——Cfront、MSVC 与 ABI 对照
C++ 对象模型实战(七):菱形继承与虚继承——vbptr 与偏移表
C++ 对象模型实战(六):多继承——多 vptr、this 调整与 adjustor thunk
C++ 对象模型实战(五):虚函数机制(下)——构造中的 vptr 切换、虚析构与纯虚
C++ 对象模型实战(四):虚函数机制(上)——vptr、虚表与间接调用
C++ 对象模型实战(三):单继承——基类子对象位置、构造链与切片
C++ 对象模型实战(二):栈对象、堆对象与 this 指针的本质
C++ 对象模型实战(一):对象布局、对齐与 sizeof 的三条规则
Claude Code 学习笔记:常用命令与 CLI 深度使用
Windows C++ 崩溃治理工具链:WinDbg、ASan、Crashpad 与符号服务器
工具链是分水岭
前面四篇讲的都是”代码层面的崩溃原理”。但真正到了线上环境,你需要的是一套工具链:在崩溃发生时保存现场,事后把内存地址还原成源代码位置,定位根因。
这一篇介绍 Windows C++ 崩溃治理中最实用的几条工具链:
- WinDbg:分析 MiniDump,还原调用栈。
- AddressSanitizer:编译期插桩,抓越界和 use-after-free。
- gflags + Page Heap:系统级严格堆检查。
- Application Verifier:更全面的运行时验证。
- Crashpad / Breakpad:生产级崩溃采集与上报。
- PDB 符号服务器:让线上 dump 能还原符号。
Windows C++ 并发与工程问题:多线程竞争、SIOF 与跨模块内存分配
Windows C++ 常见崩溃类型:从空指针到纯虚调用的现象与治理
Windows C++ 异常处理机制:VEH、SEH、UEF 与 MiniDump 实战
Windows C++ Crash 治理全景:异常机制、崩溃类型与工具链实践
Xinle_Player:一个 Qt6 + FFmpeg + OpenGL 播放器与特效系统的演进
项目背景
Xinle_Player 是一个独立的本地视频播放器演示工程,参考 Olive 0.1 音视频处理与 GLSL 特效管线的思路,针对 Qt 6.9.1 + MSVC 2022 + OpenGL 3.3 Core Profile 环境重新实现。
C++相关的若干面试问题记录
一次技术沟通中,发现与我做不同项目的同行,在 C++ 机制和操作系统 API 上特别有心得。交流后对我启发很大,把当时聊到的问题按”面试题 + 答案”的方式整理如下,方便速查和背诵。
补充 hexo 博客的使用
开发环境问题处理
H.264 总结
1 | ┌──────────────────────────────────────────────────┐ |
这个图片是经过概念梳理后做的信息提取说明图,但是理清了 H.264 的内部关系,并且对 H.264 的结构和网络传输的概念予以说明,H.264 的传输说明应该关注的是 RTP 等协议,这些都有专门的 RFC 文档和对应的开源库。
Git 案例
本文记录记录一些实际操作的案例,可以结合 GitHub 基本操作教程 在工作中熟悉 Git 的使用。
C/C++ 技术随笔
单例模式的目的是确保唯一实例,确切的说是为了在应用程序的进程空间中确保唯一实例,刚刚在视频处理器的使用中被这种设计小小震撼一下:
使用 OBS 开发零散记录
这个笔记比较乱,记录下 OBS 源码分析和使用 OBS 开发的一些做法。
OBS 编译记录
OBS 的编译还是有陷阱的,这次编译出来留一个文档。
C++ 特性之 promise/future 示例
Ubuntu/Winodws 开发环境打点备忘
C++和lua混合程序设计
SICP 相关
首先进行环境安装,其次记录重要信息提示。
Qt 开发随笔,不断更新ing
状态模式实现与内存泄漏问题解决
OpenGL小记
WebRTC 库在 Windows 平台编译(支持 H.264)
Vim 教程
SRS 多种手段推拉流
这篇文章记录几种与 SRS 之间推拉流的方法。
技术的简单性、累积性和组合性
刚刚在公众号“道哥的黑板报”,看了道哥最新的文章《如何看待一项技术:技术的本质》,文中的观点与我最近的感悟不谋而合。
《Linux 多线程服务端编程》阅读与实践(1)
借助 gcc 理解编译系统(compilation system)
hexo搭建环境完毕后写博客的步骤
gdb 使用
程序的内存布局
在命令行中运行程序的过程,是命令行会对程序进行复制,然后创建一个进程运行这个程序。因此,程序的内存结构所涉及的操作系统术语应该是 Linux 内存管理。
自然语言处理综述
本文是对前段时间学习自然语言处理(NLP)的总结。本文先介绍自然语言处理的内容,及其基于统计学的处理方式,在这个过程,逐渐矩阵化数据,看到矩阵化即可以想到机器学习方法的引入,预见到深度学习技术广泛应用的必然性。本文结尾我提供两个自己学习过程中建立的仓库,一个是对学习内容的总结,另一个是个对话机器人。
GitHub 使用
最新:更新一些 GitHub 使用异常的故障排查
- 问题1: Connection reset by 20.205.243.166 port 22
解决方法:C://User/
1 | Host github.com |
1 本地 repo
设置姓名和邮箱
git config --global user.name "xxxx"git config --global user.email "xxxx@yyy.zzz"创建并初始化本地空仓库
git init <repo_name>查看提交的状态
git status暂存区中添加更改
git add <file_name>记录一行提交信息
git commit -m "commit info"提交记录
git log忽略特定格式文件格式
touch .gitignore && vim .gitigonre*.out *.py原有创建的格式用 git rm —cached
忽略
常用工程的 ignore文件。回滚操作
1
2git reset --hard <commit ID> # <commit ID> 有两种,一种很长,一种截取前一种的若干字符表示
git push -f -u origin main # 好坑,参考资料写 master解决push冲突
假设用户1修改了 xxx文件,并且 push 了,我这边再修改后 push 会提示拒绝,有冲突,查看冲突:
git diff master origin/master建议将该文件备份,然后执行以下操作(备份,先拉取再合并:
1 | git pull |
GitHub 创建本地仓库缓存,在本地构建 GitHub 云端方法
(1) 在机器 a 上执行以下语句,可在该机建立了一个暂存区。
git init --bare /home/hanxinle/xdisk.git
(2)在机器 b 执行
git clone hanxinle@xx.mm.yy.zz:/home/hanxinle/xdisk.git
则将 repo 拉取到本地,在本地创建文件等更改后,在本地可执行 add,commit,push 操作。
(3)其它机器执行
git clone hanxinle@xx.mm.yy.zz:/home/hanxinle/xdisk.git
则可以在得到与机器b一致的 repo。
2 远程 repo
查看分支
git branch创建分支
git branch <branch_name切换到分支
git checkout <branch_name>创建并且切换
git checkout -b <branch_name>分支合并(位于 master )
git merge <sub_branch_name>同步后可以删除这个子分支
git branch -d <sub_branch_name>分支同步
git push origin <loacl_branch_name>(将本地分支同步到服务器)分支删除与重命名
git brach -D/-d PS 删除 see git -h远端分支重命名(创建本地分支—>同步到远端—>删除远端同名分支—>原本地分支重命名—>推送到远端)
git checkout -b <local_branch>git push origin <local_branch>git push --delete origin <local_name>git commit -m <local_name> <new_branch_name>git push origin <new_branch_name>tag 管理
网页端 release 中管理,和 commit 的哈希值相关。
3 免密操作
执行命令 ssh-keygen,一路回车,在 .ssh 文件夹中, id_rsa 为私有, id_rsa.pub 为公有,在 Github 中点击右上角自己的头像,选择 setting ,在 ssh 相关设置中,点击 NEW SSH KEY ,将 id_rsa.pub 的内容复制进来,此时 push 还是需要用户名密码,有两种方式可以免输入,一种是编辑.git/config 文件,将 url=https:xxxxx 更改,它的值在网页端打开 github repo 的时候,选择 clone or download 按钮,会有 use ssh 一项,点击这一项,复制 url 链接到.git/config 文件替换 url=
另一种方式是在 clone 命令时,不要通过 https 命令操作,直接通过上面这个 ssh 的 url 方式操作.
4 fork 后用 upstream 同步原始 repo 最新情况
首先 git clone 到本地
查看远端分支
git remote -v添加upstream分支
git remote add upstream git@xxxx.git将upstream版本拉到本地
git fetch upstream再合并upstream master
git merge upstream/master最后push到远端
git push origin master
5 其它 repo 选项
Issue
bug提交
Projects
项目进度管理
Wiki
项目的介绍,可以制作网页,补充其它必要的文档,背景
Gist
代码\文档的片段
MPI集群配置和mxnet分布式训练
首先讲集群配置,mpi方案放弃openmpi,原因:在网上很少找到资料 && 出错信息不友好。
Windows程序设计总结
Visual Studio dll的编写和使用
装载、链接、库(特别是 Linux 平台相关内容)