自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 资源 (7)
  • 收藏
  • 关注

原创 SLAM入门之视觉里程计(6):相机标定 张正友经典标定法详解

想要从二维图像中获取到场景的三维信息,相机的内参数是必须的,在SLAM中,相机通常是提前标定好的。张正友于1998年在论文:”A Flexible New Technique fro Camera Calibration”提出了基于单平面棋盘格的相机标定方法。该方法介于传统的标定方法和自标定方法之间,使用简单实用性强,有以下优点:不需要额外的器材,一张打印的棋盘格即可。标定简单,相机和标定

2018-01-24 20:09:53 2898

原创 SLAM入门之视觉里程计(5):单应矩阵

在之前的博文OpenCV,计算两幅图像的单应矩阵,介绍调用OpenCV中的函数,通过4对对应的点的坐标计算两个图像之间单应矩阵HH,然后调用射影变换函数,将一幅图像变换到另一幅图像的视角中。当时只是知道通过单应矩阵,能够将图像1中的像素坐标(u1,v1)(u_1,v_1)变换到图像2中对应的位置上(u2,v2)(u_2,v_2),而没有深究其中的变换关系。单应(Homography)是射影几何

2018-01-15 21:30:22 1303

原创 SLAM入门之视觉里程计(4):基础矩阵的估计

在上篇文章中,介绍了三位场景中的同一个三维点在不同视角下的像点存在着一种约束关系:对极约束,基础矩阵是这种约束关系的代数表示,并且这种约束关系独立与场景的结构,只依赖与相机的内参和外参(相对位姿)。这样可以通过通过匹配的像点对计算出两幅图像的基础矩阵,然后分解基础矩阵得到相机的相对位姿。通过匹配点对估算基础矩阵基础矩阵表示的是图像中的像点p1p_1到另一幅图像对极线l2l_2的映射,有

2018-01-06 14:22:09 2285

原创 SLAM入门之视觉里程计(3):两视图对极约束 基础矩阵

在上篇相机模型中介绍了图像的成像过程,场景中的三维点通过“小孔”映射到二维的图像平面,可以使用下面公式描述: x=MXx = MX其中,cc是图像中的像点,MM是一个3×43\times4的相机矩阵,XX是场景中的三维点。 通过小孔相机模型,可知假如从像点xx向相机的中心CC反投影一条射线xC−→\overrightarrow{xC},则该射线必定经过对应像点的三维空间点XX,但显然仅仅通过

2017-12-30 20:52:00 1305

原创 SLAM入门之视觉里程计(2):相机模型(内参数,外参数)

相机成像的过程实际是将真实的三维空间中的三维点映射到成像平面(二维空间)过程,可以简单的使用小孔成像模型来描述该过程,以了解成像过程中三维空间到二位图像空间的变换过程。 本文包含两部分内容,首先介绍小孔成像模型的各种几何关系;接着描述了成像过程中的四种坐标系(像素坐标,图像坐标,相机坐标,世界坐标)的变换关系。小孔成像模型相机可以抽象为最简单的形式:一个小孔和一个成像平面,小孔位于成像平面和真实的

2017-12-27 18:20:40 1784

原创 SLAM入门之视觉里程计(1):特征点的匹配

SLAM 主要分为两个部分:前端和后端,前端也就是视觉里程计(VO),它根据相邻图像的信息粗略的估计出相机的运动,给后端提供较好的初始值。VO的实现方法可以根据是否需要提取特征分为两类:基于特征点的方法,不使用特征点的直接方法。 基于特征点的VO运行稳定,对光照、动态物体不敏感。图像特征点的提取和匹配是计算机视觉中的一个基本问题,在视觉SLAM中就需要首先找到相邻图像对应点的组合,根据这些匹配的点对

2017-12-20 22:06:45 7306 1

原创 图像处理基础(6):锐化空间滤波器

前面介绍的几种滤波器都属于平滑滤波器(低通滤波器),用来平滑图像和抑制噪声的;而锐化空间滤波器恰恰相反,主要用来增强图像的突变信息,图像的细节和边缘信息。平滑滤波器主要是使用邻域的均值(或者中值)来代替模板中心的像素,消弱和邻域间的差别,以达到平滑图像和抑制噪声的目的;相反,锐化滤波器则使用邻域的微分作为算子,增大邻域间像素的差值,使图像的突变部分变的更加明显。本位主要介绍了一下几点内容: - 图

2017-12-18 01:33:14 3676 2

原创 图像处理基础(5):双边滤波器

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成:一个函数由像素欧式距离决定滤波器模板的系数另一个函数由像素的灰度差值决定滤波器的系数其综合了高斯滤波

2017-02-19 17:41:44 1632 1

原创 图像处理基础(4):高斯滤波器详解

本文主要介绍了高斯滤波器的原理及其实现过程高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1;而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小。什么是高斯滤波器既然名称为高斯滤波器,那么其和高斯

2017-02-16 21:50:36 1902 1

原创 图像处理基础(3):均值滤波器及其变种

均值滤波器可以归为低通滤波器,是一种线性滤波器,其输出为邻域模板内的像素的简单平均值,主要用于图像的模糊和降噪。 均值滤波器的概念非常的直观,使用滤波器窗口内的像素的平均灰度值代替图像中的像素值,这样的结果就是降低图像中的“尖锐”变化。这就造成,均值滤波器可以降低噪声的同时,也会模糊图像的边缘。均值滤波器的处理结果是过滤掉图像中的“不相关”细节,其中“不相关”细节指的是:与滤波器模板尺寸相比较小的

2017-02-14 21:27:08 2346

原创 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)

本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比。最后,对中值滤波器的优缺点了进行了总结。空间滤波器一个空间滤波器包括两个部分:一个邻域,滤波器进行操作的像素集合,通常是一个矩形区域对邻域中像素进行的操作一个滤波器就是在选定的邻域像素上执行预先定义好的操作产生新的像素,并用新的像素替换掉原来像

2017-02-08 19:44:06 9051 1

原创 图像处理基础(1):噪声的添加和过滤

总结学习下图像处理方面基础知识。这是第一篇,简单的介绍下使用OpenCV的三个基本功能:图像的读取图像的显示访问图像的像素值然后概述下图像噪声的类型,并为图像添加两种常见的噪声:高斯噪声和椒盐噪声。 最后,使用中值滤波和均值滤波来处理带有噪声的图像。OpenCV基础在OpenCV中,完成图像的输入输出以及显示,只需要以下几个函数:namedWindow 创建一个可以通过其名字引用的窗口。

2017-02-06 22:35:38 2817

原创 Golomb和Exp-Golomb编码原理及实现

2017年的第一篇博文。本文主要有以下三部分内容:介绍了Golomb编码,及其两个变种:Golomb-Rice和Exp-Golomb的基本原理C++实现了一个简单的BitStream库,能够方便在bit流和byte数字之间进行转换C++实现了Golomb-Rice和Exp-Golomb的编码,并进行了测试。在本位的最后给出了源代码的下载地址。Golomb编码的基本原理Golomb编码是一种无

2017-01-18 18:35:46 4339 1

原创 生成特定分贝的音频波形

在处理音频的时候的有时候需要特定分贝(如-10dB)的音频波形,本文主要介绍如何生成特定分贝数的音频文件。有以下几个方面:简单的生成特定分贝的波形 模拟频率和数字频率波形生成代码的封装 正弦波、方形波、锯齿波、三角波的生成生成特定分贝特定形状的波形简单的生成特定分贝的波形波形可以通过一个周期内幅度值的变化来描述,所以要生成指定的波形就要知道两个量:周期(频率)和幅度的变化值。数字信号通

2016-12-19 15:17:46 3582

原创 Windows下Visual studio 2013 编译 Audacity

编译的Audacity版本为2.1.2,由于实在windows下编译,其源代码可以从Github上取得 git clone https://github.com/audacity/audacity。1. 编译WxWidgetsAudacity使用wxWidgets作为GUI的框架,Audacity2.1.2需要wxWidgets 3.0.2,所以在编译Audacity之前需要编译wxWidgets

2016-12-14 16:36:24 842

原创 C++ 拷贝构造函数和赋值运算符

本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数、什么情况下调用赋值运算符。最后,简单的分析了下深拷贝和浅拷贝的问题。拷贝构造函数和赋值运算符在默认情况下(用户没有定义,但是也没有显式的删除),编译器会自动的隐式生成一个拷贝构造函数和赋值运算符。但用户可以使用delete来指定不生成拷贝构造函数和赋值运算符,这样的对象就不能通过值传递,也不能进行赋值运算。class Pe

2016-12-07 16:38:20 409

原创 FFmpeg 中AVPacket的使用

AVPacket保存的是解码前的数据,也就是压缩后的数据。该结构本身不直接包含数据,其有一个指向数据域的指针,FFmpeg中很多的数据结构都使用这种方法来管理数据。AVPacket的使用通常离不开下面4个函数:使用av_packet_alloc来创建一个AVPacket的实例,但该函数并不会为数据分配空间,其指向数据域的指针为NULL。 通常调用av_read_frame将流中的数据读取到AVP

2016-12-06 18:27:08 10678 2

原创 C++ 11 多线程--线程管理

说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段。并行是指两个或多个独立的操作同时进行。注意这里是同时进行,区别于并发,在一个时间段内执行多个操作。在单核时代,多个线程是并发的,在一个时间段内轮流执行;在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行。例如现在常见的4核4线程可以并行4个线程;4核8线程则使用了超线程技术,把一个物理核模拟为2个逻辑核心,

2016-12-05 17:12:33 887

原创 模仿Linux内核kfifo实现的循环缓存

想实现个循环缓冲区(Circular Buffer),搜了些资料多数是基于循环队列的实现方式。使用一个变量存放缓冲区中的数据长度或者空出来一个空间来判断缓冲区是否满了。偶然间看到分析Linux内核的循环缓冲队列kfifo的实现,确实极其巧妙。kfifo主要有以下特点:保证缓冲空间的大小为2的次幂,不是的向上取整为2的次幂。使用无符号整数保存输入(in)和输出(out)的位置,在输入输出时不对in

2016-11-16 17:02:15 2106

原创 FFmpeg + SoundTouch实现音频的变调变速

本文使用FFmpeg + SoundTouch实现将音频解码后,进行变调变速处理,并将处理后的结果保存为WAV文件。 主要有以下内容:实现一个FFmpeg的工具类,保存多媒体文件所需的解码信息将解码后的音频保存为WAV文件SoundTouch的使用指南1.从视频文件中提取音频保存为WAV文件本小节实现从视频文件中提取音频,解码并保存为WAV文件。 在使用FFmpeg解码时,一般的流程是:

2016-10-27 10:58:22 3813

原创 C++标准库实现WAV文件读写

在上一篇文章RIFF和WAVE音频文件格式中对WAV的文件格式做了介绍,本文将使用标准C++库实现对数据为PCM格式的WAV文件的读写操作,只使用标准C++库函数,不依赖于其他的库。WAV文件结构WAV是符合RIFF标准的多媒体文件,其文件结构可以如下: WAV 文件结构 RIFF块 WAVE FOURCC fmt 块 fact 块(可选) data块(包含PCM数据)首先是

2016-10-17 17:23:03 6192 3

原创 RIFF和WAVE音频文件格式

RIFF file formatRIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构。RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF格式存储的数据有: - 音频视频交错格式数据 .AVI - 波形格式数据 .WAV - 位图数据格式 .RDI - MIDI格式数据 .RMI

2016-10-13 18:43:02 2939

原创 声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS

需要做个音频的PPM表,看着一堆的音频术语真是懵了,苦苦在网上扒了几天的文档,终于有了点收获,下面关于声音的分贝做个总结。分贝 Decibel分贝(dB)是一个对数单位(logarithmic unit), 它和很多常见的单位如“米”,“秒”或者“千克”等物理单位是不同的,它并不能直接用来描述一个物理量的大小或者多少,它表示的是两个相同单位物理量的比值。分贝经常用来描述声音,如超过50dB的噪声

2016-10-10 23:12:14 3750 1

原创 VS中C++ 项目重命名

应该都有过这样的经历,在Visual studio中创建解决方案,添加几个项目进去,然后开始愉快的敲代码…。写代码正欢的时候,却总是感觉那里有些不舒服,一细看,这项目名称取的真心挫,修改个吧。直接右击项目名->重命名,修改一个让自己舒心的名称。然而,真的就这么简单么。打开项目所在文件夹,怎么文件夹名字还是原来的那个啊,对于有强迫症的人来说这是不能认的。改了!然而,重新打开解决方案却发现,修改名称的那

2016-10-08 23:05:50 4775

原创 DIB位图(Bitmap)的读取和保存

设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上。它的文件结构是标准化的,可以在Windows/Linux/Unix等平台上显示相同的效果。本文主要介绍了 1. 如果将位图文件从磁盘读到内存中 2. 在内存中对位图文件进行操作后,如何将位图保存到磁盘1 读取位图到内存中1.1 DIB文件结构要将位图文件(.b

2016-09-30 21:15:54 5052

原创 FFmpeg学习6:视音频同步

在上一篇文章中,视频和音频是各自独立播放的,并不同步。本文主要描述了如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放的。主要有以下几个方面的内容 * 视音频同步的简单介绍 * DTS 和 PTS * 计算视频中Frame的显示时间 * 获取Audio clock(audio的播放时长) * 将视频同步到音频上,实现视音频同步播放视音频同步简单介绍一般来说,视频同步指的

2016-09-23 16:06:46 1169

原创 FFmpeg学习5:多线程播放视音频

在前面的学习中,视频和音频的播放是分开进行的。这主要是为了学习的方便,经过一段时间的学习,对FFmpeg的也有了一定的了解,本文就介绍了 如何使用多线程同时播放音频和视频(未实现同步),并对前面的学习的代码进行了重构,便于后面的扩展。 本文主要有以下几个方面的内容: * 多线程播放视音频的整体流程 * 多线程队列 * 音频播放 * 视频播放 * 总结以及后续的计划1. 整体流程FFmp

2016-09-19 23:53:27 1301

原创 FFmpeg学习4:音频格式转换

前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式的,所以通过FFmpeg解码出来的数据不能直接发送到SDL进行播放,需要进行一个格式转换。通过网上一些资料,也能够正确的播放音频了,但是对具体的音频转换过程不是很了解,这里就对FFmpeg的对音频的存储

2016-09-07 23:20:16 8156 2

原创 FFmpeg数据结构:AVPacket解析

本文主要从以下几个方面对AVPacket做解析: * AVPacket在FFmpeg中的作用 * 字段说明 * AVPacket中的内存管理 * AVPacket相关函数的说明 * 结合AVPacket队列说明下AVPacket在传递过程中数据缓存的管理查了一些资料,发现FFmpeg的版本更新还是挺快,而且有很多API也有改动,本文使用的FFmpeg的最新版本3.1。AVPacket简介A

2016-08-23 22:22:48 2468

原创 FFmpeg学习3:播放音频

参考dranger tutorial,本文将介绍如何使用FFmpeg解码音频数据,并使用SDL将解码后的数据输出。 本文主要包含以下几方面的内容: * 关于播放音频的需要的一些基础知识介绍 * 使用SDL2播放音频 * 数据队列 * 音频格式的转换 dranger tutorial确实入门FFmpeg比较好的教程,虽然作者在2015年的时候根据新版本的FFmpeg更新了,

2016-08-23 22:21:32 2563 1

原创 FFmpeg学习2:解码数据结构及函数总结

在上一篇文章中,对FFmpeg的视频解码过程做了一个总结。由于才接触FFmpeg,还是挺陌生的,这里就解码过程再做一个总结。 本文的总结分为以下两个部分:数据读取,主要关注在解码过程中所用到的FFmpeg中的结构体。解码过程中所调用的函数在学习的过程主要参考的是dranger tutorial,所以跟着教程在本文的最后使用SDL2.0将解码后的数据输出到屏幕上。数据的读取一个多媒体文件包含有

2016-08-23 22:20:55 948

原创 FFmpeg学习1:视频解码

在视频解码前,先了解以下几个基本的概念: * 编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分。 * 容器/多媒体文件(Container/File):没有了解视频的编解码之前,总是错误的认为平常下载的电影的文件的后缀(avi,mkv,rmvb等)就是视频的编码方式。事实上,刚才提到的几种文件的后缀 并不是视频的编码方式,只是其封装的方式。一个视

2016-08-23 22:19:58 1232

原创 Visual studio 通用开发环境配置:SDL,FFMPEG为例

引言每一个C++库的使用都是从开发环境的配置开始的,其实每个库的配置过程都是大同小异,总结下来有下面几个步骤: 1. 下载库文件,这里假定是已经预先编译完成的。 2. 配置库文件的包含目录(include)和库目录(lib) 3. 配置库文件的动态链接库(dll),这一步是很多人容易忽略的。上面配置好包含目录和库目录,只是开发环境配置完成了,没有配置好dll,在使用该库的程序运行时,会造成操作

2016-08-23 22:18:52 1468

原创 SSE指令集学习:Compiler Intrinsic

大多数的函数是在库中,Intrinsic Function却内嵌在编译器中(built in to the compiler)。1. Intrinsic FunctionIntrinsic Function作为内联函数,直接在调用的地方插入代码,即避免了函数调用的额外开销,又能够使用比较高效的机器指令对该函数进行优化。优化器(Optimizer)内置的一些Intrinsic Function行为信息

2016-08-23 22:17:49 5792 4

原创 SSE指令集优化学习:双线性插值

对SSE的学习总算迈出了第一步,用2天时间对双线性插值的代码进行了优化,现将实现的过程梳理以下,算是对这段学习的一个总结。1. 什么是SSE说到SSE,首先要弄清楚的一个概念是SIMD(单指令多数据流,Single Instruction Multiple Data),是一种数据并行技术,能够在一条指令中同时对多个数据执行运算操作,增加处理器的数据吞吐量。SIMD特别的适用于多媒体应用等数据密集型运

2016-08-22 00:27:35 4651 4

原创 C++ 面试(1)指针

指针是C++中一类颇具特色的数据类型,允许直接操作内存地址,实现内存的动态分配。指针问题通常包括指针常量,常量指针,数组指针,指针数组,函数指针,指针传值等。指针和引用的区别非空区别。在任何情况下都不能使用指向空值的引用。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如

2015-10-08 21:48:43 607

原创 struct 大小的计算

结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率。在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员按照其声明顺序在存储器中顺序存储。自然对齐是指按照结构体中成员size最大的对齐,在cl编译器下可以使用#pragma pack(n)来指定结构体的对齐方式。默认对齐方式在默认对齐方式下,结构体成员的内

2015-10-03 15:02:29 895

原创 SIFT特征详解

1.SIFT概述SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换,由加拿大教授David G.Lowe提出的。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。1.1 SIFT算法具的特点图像的局部特征,对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。独特性好,信息量丰富,适用于

2015-09-24 21:39:18 2310

Golomb编码和指数哥伦布编码 exp-Golomb

使用C++实现了Golomb-Rice编码和Exp-Golomb编码。 里面还包含有一个bitstream库,用来将bit流转换为byte buffer,或者将byte buffer转换为bitstream 相关的博文地址:http://www.cnblogs.com/wangguchangqing/p/6297792.html

2017-01-18

OpenCV 特征点匹配及 优化下载

博客 http://www.cnblogs.com/wangguchangqing/p/4333873.html 中的demo代码,鉴于有很多人想参考下,就上传到这了。 主要是匹配后,计算两视图的基础矩阵F,然后再除去不适合的匹配点. 代码中 好像还有一部分三角计算的代码

2017-01-04

生成指定分贝数指定形状的音频波形

能够生成指定分贝数的音频波形,并可选择正弦波、方形波、三角波以及锯齿波,sample的类型有16位,32位整型以及单精度浮点数。 带有wav文件的读写类,wavOutFile和WavInFile能够很方便的多谢wav文件

2016-12-19

模仿Linux内核kfifo实现的循环缓存

模仿Linuxe内核kfifo实现的循环缓存

2016-11-16

FFmpeg + SoundTouch实现音频的变调变速

使用FFmpeg + SoundTouch 实现语音的变速变调。 压缩包中有两个V岁2013的Project,SoundTouch编译结果为静态链接库;wav_sound需要使用SoundTouch的编译库,另外还需要根据自己的环境自行配置FFmpeg3.1的环境。

2016-10-27

SoundTouch VS2013 Project

开源的音频变调、变速库的VS2013版本。官方的版本使用的是VS2008,编译的出来的静态库在VS2013上使用不成功。

2016-10-27

使用标准C++库实现的WAV音频文件读写

200行代码实现PCM格式的WAV文件的读写,使用标准C++库实现,不依赖于其他库。 // Write WAv文件 Wave_header header(1, 48000, 16); uint32_t length = header.fmt_data->sample_per_sec * 10 * header.fmt_data->bits_per_sample / 8; uint8_t *data = new uint8_t[length]; CWaveFile::write("e:\\test1.wav", header, data, length); // read //CWaveFile wave; //wave.read("e:\\test1.wav");

2016-10-17

空空如也

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

TA关注的人

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