自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

梦的灰色边沿...

无厘头的疯子

  • 博客(168)
  • 资源 (1)
  • 问答 (4)
  • 收藏
  • 关注

原创 光流法:从传统方法到深度学习方法

光流(Optical Flow)是指图像中像素灰度值随时间的变化而产生的运动场。简单来说,它描述了图像中每个像素点的运动速度和方向。光流法是一种通过分析图像序列中像素灰度值来计算光流的方法。对于图像数据计算出来的光流是一个二维向量场。比如Opencv官方给的示例图,该图中显示了一个连续运动的光点,箭头的方向表示光流的方向,箭头的大小表示光流的大小。有了光流场,我们就可以利用光流场来跟踪图像中的目标物体,就可以进行运动跟踪,目标检测,视频压缩,运动分割,三维重建等。

2025-04-28 22:34:41 1158 1

原创 图像处理——边缘检测

边缘检测是图像处理和计算机视觉中的一项基本技术,用于识别图像中亮度变化剧烈的像素点,这些像素点通常对应于物体的边界。它通过检测图像中亮度或颜色变化显著的区域,提取出物体的轮廓,常用于计算机视觉、图像处理和模式识别等领域。边缘检测的原理是通过计算图像中每个像素点与其周围像素点的亮度或颜色差异来确定该像素点是否为边缘。通常使用卷积操作来实现边缘检测,通过计算像素点与其周围像素点的差异来判断该像素点是否为边缘。基于搜索的方法: 基于搜索的边缘检测方法首先计算边缘强度,通常用一阶导数表示,例如梯度模;

2025-04-26 10:46:49 1295

原创 Nvidia显卡架构演进

显示卡(英语:Display Card)简称显卡,也称图形卡(Graphics Card),是个人电脑上以图形处理器(GPU)为核心的扩展卡,用途是提供中央处理器以外的微处理器帮助计算图像信息,并将计算机系统所需要的显示信息进行转换并提供逐行或隔行扫描信号给显示设备,是连接显示器和个人电脑主板的重要组件,是“人机交互”的重要设备之一。显卡有时被称为独立显卡或专用显卡,以强调它们与主板上的集成图形处理器(集成显卡)或中央处理器 (CPU) 的区别。

2025-04-19 23:15:29 1378 1

原创 #Linux动态大小裁剪以及包大小变大排查思路

库分为动态库和静态库,动态库是在程序运行时才加载,静态库是在编译时就加载到程序中。动态库的大小通常比静态库小,因为动态库只包含了程序需要的函数和数据,而静态库则包含了所有的函数和数据。静态库可以理解为引入源码编译,链接器在链接过程中会自动分析需要可不需要的代码进行删除裁剪。因此静态库不存在包大小问题(除了特定平台生成静态库过大导致无法生成库文件的问题)。

2025-04-19 00:00:15 440

原创 自旋锁(C++实现)

自旋锁是一种典型的无锁算法,在任何时刻,它都最多只能有一个保持者。当有一个线程试图获得一个已经被占用的锁时,该线程就会一直进行循环等待,直到该锁被释放。自旋锁的优点是不会使线程状态发生切换,一直处于用户态,即线程一直都是active的;缺点是如果一直获取不到锁,那线程就一直处于循环等待中,白白浪费CPU资源。自旋锁在某些场景下非常有效,尤其是临界区较小且持有时间短的情况下。然而,在高竞争或临界区较长的情况下,使用自旋锁可能导致性能下降,因此需谨慎选择。

2025-04-05 18:08:13 763 1

原创 代码覆盖率(LLVM)

代码覆盖率是软件测试中用来评估测试用例效果的一个重要指标,表示被测试代码中实际执行的部分与总代码的比率。它能帮助开发者了解哪些代码得到了测试,哪些部分未被覆盖,从而改进测试用例的设计和执行。通过代码覆盖率的分析,开发者可以发现潜在的缺陷和未被测试的代码,从而提高软件质量和测试效率。代码覆盖率测试虽然能够帮助开发者发现问题,但也并不意味着代码覆盖率没问题就意味着测试用例没问题。覆盖率高并不代表测试用例完全覆盖了所有可能的情况,还需要结合其他测试方法和技术来保证测试的全面性和有效性。

2025-03-30 15:32:52 537

原创 C++脚本化方案调研

能够看到不同语言的脚本化方案都有自己的优缺点,需要根据具体的场景来选择合适的方案。总的来说,脚本化方案可以提高开发效率,减少开发成本,提高代码的可维护性和可扩展性。但是,脚本化方案也存在一些问题,比如性能损失,安全风险,开发难度等。因此,在选择脚本化方案时,需要综合考虑这些问题,选择合适的方案。

2025-03-22 23:52:18 1152

原创 MagicEnum实现原理

magic_enum是一个非常好用的枚举库,它可以将枚举值转换为字符串,也可以将字符串转换为枚举值。// 3。

2025-03-17 00:17:00 553

原创 单入单出队列性能优化(Lock-Free)

文中首先介绍了有锁线程安全循环队列的基本实现,然后探讨了使用原子变量实现 Lock-Free 队列的优势,能够减少线程之间的数据竞争。接着,介绍了数据对齐的策略,以降低伪共享的概率,随后引入了索引缓存来减少索引访问冲突的影响。最后,文中提出了使用位运算替代模运算来优化循环队列的性能。

2025-02-23 17:48:48 767

原创 Lock-Free环形队列C++实现

本文描述了使用原子变量实现线程安全队列的基本原理和实现。首先分析了多线程情况下队列的访问冲突情况。然后详细描述了Lock-Free单入单出队列的原理和实现,性能测试发现其性能优势相比于带锁的队列比较明显。最后详细描述了Lock-Free堕入多出队列的原理和实现,并给出了准确的性能测试数据。

2025-02-23 16:06:38 694

原创 《Performance Analysisi and Tuning on Modern CPU》阅读笔记

本文是《Performance Analysisi and Tuning on Modern CPU》的阅读笔记。该书首先详细描述了现代CPU的硬件架构,一些性能指标和性能优化分析工具。然后介绍了一些从代码上如何修改能够使得代码更加快速的技术细节。最后描述了其他一些技术,并且展望了为了性能优化可能的方向。本文不会赘述硬件架构相关的内容,重点关注第二部分代码优化部分。

2025-02-13 23:46:57 875

原创 理解PLT表和GOT表

PLT 和 GOT 是现代动态链接的核心机制,通过延迟绑定和地址无关性,提升了动态库的加载效率和灵活性。这些机制确保了代码复用及共享的优势,同时优化了性能。

2025-01-30 19:15:23 1051

原创 《Memory Barriers a Hardware View for Software Hackers》阅读笔记

每个 CPU 都有其特有的内存屏障指令,这使得跨平台的代码移植性面临挑战。许多软件环境(包括 pthreads 和 Java)限制程序员直接使用内存屏障,转而使用包含必要内存屏障的互斥原语。表 5 列出了不同 CPU 允许的加载和存储重排序的组合。具体而言,前四列表示 CPU 允许的四种加载和存储重排序的组合,接下来的两列表示 CPU 是否允许与原子指令的重排序。以下是一些关键点:在六个 CPU 中,有五种不同的加载-存储重排序组合和四种原子指令重排序的三种可能。

2025-01-24 19:33:55 1182

原创 简要描述C++ Memory Order

memory_order_relaxed: 最宽松的内存顺序, 只保证操作的原子性和修改顺序 (modification order).

2024-07-06 23:11:46 891

原创 Vulkan学习——渲染3D模型

Vulkan是一个低开销、跨平台的二维、三维图形与计算的应用程序接口(API),最早由科纳斯组织在2015年游戏开发者大会(GDC)上发表。与OpenGL类似,Vulkan针对全平台即时3D图形程序(如电子游戏和交互媒体)而设计,并提供高性能与更均衡的CPU与GPU占用,这也是Direct3D 12和AMD的Mantle的目标。与Direct3D(12版之前)和OpenGL的其他主要区别是,Vulkan是一个底层API,而且能执行并行任务。除此之外,Vulkan还能更好地分配多个CPU核心的使用。

2024-07-01 18:30:13 2896

原创 FFmpeg5.0源码阅读——格式检测

在拿到一个新的格式后,FFmpeg总是能够足够正确的判断格式的内容并进行相应的处理。本文在描述FFmpeg如何进行格式检测来确认正在处理的媒体格式类型,并进行相应的处理。

2024-07-01 15:46:19 627

原创 C++异常处理实现(libstdc++)

为了更好的理解C++中异常处理的实现,本文简单描述了Itanium ABI中异常处理的流程和llvm/libsdc++简要实现。

2024-05-05 17:10:01 1695

原创 X264编码器参数

H.264是ITU(International Telecommunication Unite 国际通信联盟)和MPEG(Motion Picture Experts Group 运动图像专家组)联合制定的视频编码标准。从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准里称为H.264,在MPEG的标准里是MPEG-4的一个组成部分–MPEG-4 Part 10,又叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。

2024-05-02 21:59:12 1578

原创 正确对你的C++代码进行性能测试——DoNotOptimize实现原理

是google-benchmark提供的一个函数,强制编译器不要对制定的变量进行任何优化。需要注意的是DoNotOptimize强制编译器不要对制定的不指定的编译器月变量优化而不是不对表达式进行优化,也就是说你的表达式可以被优化的化依然会被优化只是结果一定写内存。return a;int a = 1;return 0;不加DoNotOptimize的化testFunc、a和t都会被删除,而编译后的结果如下。可以看到两个变量都是读取的栈内存。1147: 00。

2024-05-02 12:53:33 1213

原创 C++中volatile的具体含义和可能的坑

提醒编译器不要对该变量相关的代码进行优化,避免出现意外的负面作用;对类似的表达式不进行编译层面的指令重排。编译指令重排也是一种编译器优化手段,这条严格来说也是第一条的变种。int g = 0;a < n;a++) {i++;//func对应的汇编a < n;a++) {j++;//func1 对应的汇编a < n;a++) {g++;//func2对应的汇编上面的代码中可以看到对于普通变量的++直接被编译器在编译期间就分析出来结果,直接赋值了,for循环直接被干掉了。

2024-01-22 00:52:43 2872

原创 H264之NALU结构详解

NAL层即网络抽象层(Network Abstraction Layer),是为了方便在网络上传输的一种抽象层。一般网络上传输的数据包有大小限制,而AVC的帧大小远远大于网络传输的字节大小限制。因此要对AVC的数据流进行拆包,将一帧数据拆分为多个包传输。和NAL层相对是VAL层,即视频编码层(Video Coding Layer)NALU就是经过分组后的一个一个数据包。每个NALU由一个1字节的NALU头部和一个包含控制信息或编码视频数据的字节流组成。NALU头部包含了NALU的类型以及其重要性的信息。

2023-12-10 08:08:41 1429

原创 C++ libcxxabi中dynamic_cast 实现

C++中,用于有虚函数的继承链中父类型到子类型的安全转换。class A{public:class B{如何识别当前类的类型,这依赖于RTTI。C++中包含虚函数的对象都有一个虚函数表,一般情况下都在首地址(多继承和虚继承会有多个)有一个指向该虚函数表的虚函数表指针。基类偏移;typeinfo;如果有虚函数的话会有虚析构函数指针,一般情况下有两个;虚函数指针,如果是虚继承对应的虚函数指针可能是一个thunk function。

2023-11-26 22:35:56 1347

原创 【crash】 cxa_pure_virtual 崩溃分析与原理

怀疑到这一点,我这边开始找资料(类似的问题印象中标准中是不管的,那大概率在ABI中定义的,那我们去看ABI的定义)。怀疑到这一点,我这边开始找资料(类似的问题印象中标准中是不管的,那大概率在ABI中定义的,那我们去看ABI的定义)。当类被析构时,基类的析构稍微比较耗时时,第二个线程尝试访问当前类的一个被重写的纯虚函数,由于此时的虚函数表中的纯虚函数已经被修改为。当类被析构时,基类的析构稍微比较耗时时,第二个线程尝试访问当前类的一个被重写的纯虚函数,由于此时的虚函数表中的纯虚函数已经被修改为。

2023-11-23 00:37:40 1406

原创 Folly库实现阅读——FBString

FBString是facebook内部使用的基础库的string组件,为了达到更好的性能采用了多种存储策略,优化不同场景的性能。FBString完全兼容,同时支持jemalloc更快的分配内存,减少磁盘碎片,加快并发情况下的速度和性能。实现细节三种存储策略;与100%兼容。COW 存储时对于引用计数线程安全。对 Jemalloc 友好。如果检测到使用jemalloc,那么将使用jemalloc的一些非标准扩展接口来提高性能。

2023-09-24 22:41:10 531

原创 图像处理之频域滤波DFT

傅里叶变换可以将任何满足相应数学条件的信号转换为不同系数的简单正弦和余弦函数的和。图像信号也是一种信号,只不过是二维离散信号,通过傅里叶变换对图像进行变换可以图像存空域转换为频域进行更多的处理。本文主要简要描述傅里叶变换以及其在图像处理中的简单应用,并进行一些简单的实验来描述其相关性质。

2023-09-16 21:57:34 948 1

原创 FLV封装格式

FLV流媒体格式是sorenson公司开发的一种视频格式,全称为Flash Video。它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等缺点。由于其视频文件体积轻、封装播放简单等优点,使得其非常合适在网络上传输,目前主流的视频网站无一例外支持FLV流媒体格式进行视频播放。

2023-09-09 11:46:17 261

原创 Jpeg文件格式详解

JPEG(Joint Picture Expert Group)编解码标准是由国际标准化组织(ISO)和CCITT联合制定的静态图象有损压缩编码标准(标准也定义了无损压缩内容但是大多数系统都不支持)。JPEG是一种编解码标准不是一种文件格式,其对应的文件格式有JIF,JPEG/JFIF,JPEG/EXIF等。

2023-09-03 16:50:46 4336

原创 FFmpeg5.0源码阅读——FFmpeg大体框架(以GIF转码为示例)

前一段时间熟悉了下FFmpeg主流程源码实现,对FFmpeg的整体框架有了个大概的认识,因此在此做一个笔记,希望以比较容易理解的文字描述FFmpeg本身的结构,加深对FFmpeg的框架进行梳理加深理解,如果文章中有纰漏或者错误欢迎指出。本文描述了FFmpeg编解码框架的工程结构,基本构成以及大体的调用流程。因为FFmpeg的滤镜是相对独立的一个模块,因此在此不会进行描述。

2023-08-26 17:09:39 2325

原创 FFmpeg5.0源码阅读——URLContext和URLProtocol

本文描述FFmpeg中URLContext和URLProtocal的实现。

2023-08-26 12:50:10 886

原创 C++对象模型实验(clang虚函数表结构)

本科期间有对比过msvc,gcc,clang的内存布局,距今已经6-7年了,当时还是使用的c++11。时间过得比较久了,这部分内容特别是内存对齐似乎C++17发生了一些变化,因此再实践下C++类模型。本文描述了C++不同类型的实际内存模型实现,主要关注虚函数表的具体内存布局。虽然clang,msvc都提供了对应的命令让我们直接查看类对象的内存布局,但是我们自己解析一下理解更深一点儿。

2023-08-20 22:33:20 549 1

原创 FFmpeg5.0源码阅读——VideoToobox硬件解码

本文描述了FFmpeg中。

2023-08-19 17:20:16 2495

原创 FFmpeg5.0源码阅读——av_interleaved_write_frame

本文主要详细描述FFmpeg中封装时写packet到媒体文件的函数。

2023-07-30 20:33:23 1905

原创 FFmpeg5.0源码阅读—— avcodec_send_frame && avcodec_receive_packet

本文主要描述了FFmpeg中用于编码的接口的具体调用流程,详细描述了该接口被调用时所作的具体工作。

2023-07-23 21:34:32 1089

原创 【crash】浮点除0堆损坏

然后就去看代码排查调用链中可能导致堆损坏的地方(因为开发机无法复现,因此只能通过分析+日志来排查),在排查代码过程中发现了几处可能越界的操作以及除0。IEEE754规定了浮点除0运算的结果为+INF或者-INF,但是C++标准明确规定了该行为未定义的,使用可能会导致UB。实际测试过程中发现只有低版本的机器浮点除0是不支持的,而新机器无论是windows还是Mac浮点除0编译器只会报warning但是结果是INF不会出错。,比较反常,因此排查了该值的计算来源发现是有double除0。比较小只有20个元素)。

2023-07-14 23:32:34 301

原创 FFmpeg5.0源码阅读—— avcodec_send_packet&&avcodec_receive_frame

本文主要描述了FFmpeg中用于解码的接口的具体调用流程,详细描述了该接口被调用时所作的具体工作。

2023-07-09 21:43:02 1479

原创 裁剪opencv库到2Mb

本文描述了如何对opencv进行裁剪已达到最小化,不限于使用模块编译,去除第三方库依赖,改变编译选项,限制导出符号等。

2023-07-08 22:00:44 1874

原创 FFmpeg5.0源码阅读—— av_read_frame

本文主要描述了FFmpeg中用于打开编解码器接口。

2023-07-08 21:12:50 1284

原创 简单的Elf解析器实现

之前虽然了解过ELF文件的具体格式,但是对改文件的理解还是存在一些不足,因此本文尝试写了一个简单的ELF解析器对ELF文件进行解析并输出Header,Program Header Table和Section Header Table。

2023-07-04 00:05:22 674

原创 FFmpeg5.0源码阅读—— avcodec_open2

本文主要描述了FFmpeg中用于打开编解码器接口。

2023-07-02 22:40:38 1649

原创 FFmpeg5.0源码阅读——avformat_find_stream_info

在使用FFmpeg库时通常使用。

2023-06-24 19:23:59 1171

数据结构中线性表,队列和栈

包含了数据结构中的线性表,队列和栈的具体代码,如有错误可以联系我,我可以进行修改。

2017-01-07

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

TA关注的人

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