- 博客(106)
- 资源 (52)
- 收藏
- 关注
原创 OpenGL 图像的加载和存储
之前提到过OGL中纹理缓存是作为输入缓存存在的,这使得输入缓存能够读取但是不能够改写。为了突破这一限制,在OGL中提出了Image的概念,这使得程序员能够有效的操作texture缓存——对背后的texture缓存进行读写操作。但是,这样的操作打破了原有的pipeline流水线,使得原本应该被OGL自身进行管理的缓存需要程序员自身来进行处理,因此提供了方便的同时也增加了程序员的编程负担。为了对t
2016-05-18 10:11:39 6885
原创 OpenGL纹理贴图
OGL中纹理分为两种类型,一种是常规的纹理,另一种是缓存纹理。前者和特定的纹理类型相关联,而后者则仅仅作为输出的缓存区域,和Frame buffer object粘合的纹理就是缓存纹理。不过这两者的创建过程很相似,都是利用glGenTexture函数实现纹理ID的创建,然后利用glBindTexture将ID号绑定到指定的纹理对象上。常规纹理绑定的纹理对象是指定的纹理类型,而纹理缓存则绑定到GL_
2016-05-17 10:51:26 1495
原创 OpenGL Frame Buffer管理
OpenGL应用程序进行图形渲染都是以pipeline的方式进行处理,在其中的每一个步骤都有输入和输出,渲染的最后一步是将渲染的结果绘制到屏幕上。在绘制这一步的输出是屏幕专用的存储,输入则是Frame buffer。由于OpenGL并没有窗口处理函数,所以与窗口相关的处理都需要外部的扩展来实现,因此相应的窗口处理函数会在初始化的时候分配相应的Frame buffer,同时OpenGL会将最终渲染的
2016-05-16 17:45:18 2745
原创 OpenGL Transform feed back 粒子系统
在原来的OpenGL渲染的pipeline并没有提供较多的交互接口,当调用Draw函数之后很难再绘制过程对已经装配的图元进行修改。然而,在绘制过程中存在这样的需求,尤其是需要根据之前装配好的图元来更新随后的操作。举个简单的例子,当一个场景中存在两个相对运动的物体时,后一个物体需要根据前一个物体的运动来决定自己的运动轨迹,因此需要有一种feed back来提升交互能力。Transform feed
2016-05-11 09:11:17 1828
原创 openGL画图函数
OpenGL在画图过程中大致可以分为三步,第一步创建好对应的vertex队列,同时在适当的时机将vertex绑定到GL内部;第二步利用BUFFER_ARRAY向vertex队列提交顶点信息以便对vertex队列进行初始化;第三步则是绑定已经初始化的vertex队列,同时利用对应的画图函数进行绘制。vertex队列的生成主要利用glGenVertexArrays函数完成,其第一个参数定义需要生成
2016-05-09 11:48:51 2880
原创 VISUAL SALIENCY DETECTION BASED ON BAYESIAN MODEL
文章主要利用贝叶斯推导模型来得到显著性检测映射图。贝叶斯推导模型的计算公式如下图:后验概率的意义是,在已知当前像素点的条件下,当前像素点为显著性目标的概率。为了构建上诉贝叶斯概率模型,需要提前计算出显著性值以及得到显著性区域。稳重利用color boost方法来计算焦点检测,有效的利用角点所构建出来的凸包区域来计算大致的显著性区域。由于凸包能够很好的将图像区域分割为两个部分,也就大致得
2016-05-04 11:16:51 1350 1
原创 读ICCV2013论文<Boolean Map Saliency>
基于Boolean Map进行显著性检测,关键的公式如下所示:公式可以看做是一个贝叶斯推导模型,p表示在给定图像的情况下,得到Boolean Map为B的概率,而A则表示B所能够提供的注意力映射图,而注意力映射图最终体现的是显著性映射图。在文中,作者提出利用均匀的阈值分割的方式来得到Boolean Map,也就是说,大于阈值的像素点赋值255,反之则赋值0;从阈值增长的步长固定。在实现
2016-04-28 22:57:49 947
原创 读CVPR2014论文<Saliency Optimization from Robust Background Detection>
在显著性检测中,利用背景先验进行检测是一种有效的方式。目前大多数方法是基于图像区域是否与图像边缘关联来判断当前区域是否可以作为背景先验信息,这样的方法很容易引入前景噪声。文章作者所提出的方法中,主要利用连续性来提高背景先验的鲁棒性。通俗一点说就是:目标区域不大可能与图像关联,即使与图像发生关联也只是目标区域中的很小一部分。示意图如下:在整个图像中存在四个区域,每一个图像都和图像边缘发生了关联。
2016-04-28 16:52:25 4677 8
原创 OpenGL初步
OpenGL是一个图形库,主要用于3D作图。然而,其并不提供窗口处理函数,如果想要与操作系统的窗口进行通信,需要引入GLUT也就是实用工具库。同时,由于OpenGL具有很好的平台兼容性,因此对一些函数的实现需要以指针形式进行调用。类似于动态链接库中函数的动态加载。为了便于这一部分函数的调用,进一步引入了GLEW库对函数指针的调用进行封装。编写OpenGL程序需要引入上诉函数库中的一个或者多个。下面
2016-04-06 21:16:28 476
原创 The connection to adb is down, and a severe error has occured解决
上诉问题在网上有一些解决方案,大多是重启adb服务;adb connection失败有两个方面的原因,比如找不到avd也会导致下面的问题。一般avd存在于SDK下的.android/AVD下面,如果eclipse在该目录下找不到AVD镜像就会报错。所以可以搜索一下系统中的.android文件夹,找到AVD,将avd复制到SDK下面的.android、文件夹中。重启eclipse,问题解决。
2015-07-29 16:44:30 482
原创 Windows 实现telnet协议
int kickoff_telnetd(void){ printf("Attempting to start Simple TelnetD\n"); SetConsoleCtrlHandler(Cleanup, 1); if (!StartSocketInterface()) ErrorExit("Unable to start socket interface\n");
2015-07-13 15:24:59 1849 2
原创 android RTSP流媒体播放
package com.example.internetvideo;import android.support.v7.app.ActionBarActivity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.os.Bundle;
2015-07-13 15:00:12 2475
原创 SIP 注册过程
SIP协议包含两种类型的消息,一种是请求行用于发出邀请,而另一种则是状态行,用于标明当前通信的状态。请求行和状态行军包含三部分,其中每一部分以空格隔开,不论是请求行还是状态行均以CRLF换行符结束。在请求行中,三部分内容分别为Method 请求URI和SIP版本号。如下例所示:Request-Line: REGISTER sip:192.169.1.150 SIP/2.0在这里方法是REG
2015-07-10 15:43:37 6530
原创 Android SipDemo项目实现SIP协议
上面是android系统下和SIP相关的类和接口。SipDemo总共有三个文件组成,两个activity和一个广播监听者。通过工程文件夹中的AndroidManifest.xml文件可以发现,SipDemo的启动activity是WalkieTalkieActivity类。 public void onCreate(Bundle savedInstanceState) {
2015-07-05 23:03:42 3568 2
原创 Saliency Detection: A Spectral Residual Approach
clearclc%% Read image from file inImg = im2double(rgb2gray(imread('yourImage.jpg')));inImg = imresize(inImg, 64/size(inImg, 2));%% Spectral ResidualmyFFT = fft2(inImg); myLogAmplitude =
2015-06-26 10:20:57 1277
原创 Windows bitmap文件解析
首先需要介绍的是.bmp文件的存储格式,.bmp文件由四部分组成,文件头部,文件信息头部,调色板和实际的像素信息。文件的这种组织形式类似于一种嵌套形式。typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1;
2015-06-22 16:46:26 1591
原创 CSocket类编程模型
使用CSocket对象涉及CArchive和CSocketFile 类对象。以下介绍的针对字节流型套接字的操作步骤中,只有第3步对于客户方和服务方操作是不同的,其他步骤都相同。 1、构造一个CSocket对象。 2、使用这个对象的Create()成员函数产生一个socket对象。在客户方程序中,除非需要数据报套接字,Create()函数一般情况下应该使用默认参数。而对于服务方程序,必须
2015-05-21 21:40:36 684
原创 Linux0.11内核源代码(2)
INITSEG = 0x9000 ! we move boot here - out of the waySYSSEG = 0x1000 ! system loaded at 0x10000 (65536).SETUPSEG = 0x9020 ! this is the current segmentstart: mov ax,#INITSEG mov ds,ax mov ah
2015-03-08 21:19:37 505
原创 Linux0.11内核源代码(3)
movl $0x10,%eax/*设置数据寄存器,注意CS段寄存器设置为8,而数据寄存器设置为16.仅一位有差距*/ mov %ax,%ds mov %ax,%es mov %ax,%fs mov %ax,%gs lss _stack_start,%esp call setup_idt call setup_gdt movl $0x10,%eax # reload all the
2015-03-08 21:18:59 1002
原创 Linux0.11内核源代码(1)
SYSSIZE = 0x3000SETUPLEN = 4 ! nr of setup-sectorsBOOTSEG = 0x07c0 ! original address of boot-sectorINITSEG = 0x9000 ! we move boot here - out of the waySETUPSEG = 0x9020 ! setup starts
2015-02-04 17:29:02 1176
原创 混合高斯模型用于图像分割
http://download.csdn.net/detail/dayenglish/8384547代码下载请到上面的资源页面。整个代码的思想是利用混合高斯模型计算出每个像素属于K个高斯模型中某一个的概率值,利用这个概率值取代原来的像素值达到分割图像的目的,实质是通过像素的聚类达到分割的目的。因为需要根据高斯模型求得某一个像素的概率值,因此第一步就是建立高斯模型。至于建多少个高斯模型需要手
2015-02-01 09:05:25 8903 3
原创 Marker-controlled 漫水填充分割算法
http://cn.mathworks.com/products/demos/image/watershed/ipexwatershed.htmlMarker-Controlled Watershed SegmentationSeparating touching objects in an image is one of the more difficult image pr
2015-02-01 09:02:35 2512
原创 图像直方图均衡化
上图是图像直方图均衡化的伪代码,下面根据伪代码解释均衡化的运算过程。一幅图像中每一个像素级所占的比例各不相同,因此导致视觉上不是很均衡。因此需要有一种方法将不同的像素级调整为所占比例大致一致,最好是每一个像素级占比例是一样的。而所占比例是一个概率问题,也就是说希望变化之后得到的每一个新的像素级别概率是一样的,或者说概率密度函数一样。按照数字图像处理中的老套路,先从连续变化进行推导,对于连续变化的像
2015-02-01 09:01:50 1281
原创 grub 0.97
在操作系统启动的初期,首先将PC指向磁盘的第一个块。这个区域大小为512字节,被称作MBR。这512字节组织性很好,包含了一些磁盘的基本参数和一些用于启动的代码。当然启动初期和文件系统是毫不相干的,因为文件系统和启动存在一个鸡生蛋和蛋生鸡的问题。举个很简单的例子,系统启动需要通过磁盘读取相应的执行文件,假如需要通文件系统来读取系统加载文件的话,那么先要找到文件系统以及文件系统依赖项。然而要找到文件
2015-02-01 09:00:17 957
原创 小波与滤波器组(6)
如果一个滤波器组是正交滤波器组,则应该满足下列条件:上面提到的三个条件中的第二个就是之前高频和低频滤波器组的要求,通过这一条件可以推导出另外两个公式。每一个H(z)都可以分为奇数部分和偶数部分,通过这种分解建立第二个条件和第一个条件的关联,也就证明得到第一个条件成立。根据上一篇博客中的矩阵系数可以得到,由于矩阵系数是一个正交矩阵,因此整个矩阵系数只有在与自己相交的时候得到的才不为0而等于1
2015-01-20 22:03:00 1513
原创 小波与滤波器组(5)
上面的公式是多相矩阵和之前介绍的调制矩阵的关系。下面是调制矩阵的形式。通过上面两个公式的结合可以得到下面的推导:上面的公式只是一个特例,也就是当L为奇数时才能够最后推导出FpHp的结果。但是如果L位偶数呢,则上面的结果不一定成立。下面是一个更通用的表示,不过最后的结果有一个共同点是不论L等于偶数还是奇数,两个矩阵的行列式相同。因此对整个矩阵的求解转化为对行列式的求解。而由于行列式最后是
2015-01-18 22:05:45 1113
原创 小波与滤波器组(4)
之前的滤波器组的处理都是先滤波然后进行抽取(下采样),这样的处理流程明显使得一部分计算是无效的。所以能不能利用一些转化使得计算更高效呢?上图的整个推导是根据Z变换得到的,首先V(z)是最后的结果,结果是x经过H滤波之后进行下采样得到的。而第二行和第三行则是将x和H变为奇数部分和偶数部分。合并后就得到V可以由x和H相应的偶数和奇数部分得到。图一中的流程转变为上面公式中的流程,整个计算
2015-01-18 21:38:27 1033
原创 Image Smoothing Via L0 Gradient Minimization
论文对图像平滑提出了两个条件,第一:平滑后的图像必须非常接近原来的图像;第二:图像平滑后必须保证边缘不变。对上面两个条件建模得到如下公式:其中Sp是第p次平滑之后的图像,而Ip是源图像,I不随p的变化而变化。函数C如下公式所示:这个函数主要用于统计平滑图像垂直和水平方向的梯度不为0的像素之和,也就是保持图像的边界不变。lamda是一个变量控制C和前面的累加的关系。然而这个函
2015-01-18 12:23:56 3783 2
原创 基于图分割代码解读
点击打开链接opencv支持的代码可以从上面的链接中下载。论文的思想主要是基于两方面考虑,第一:像素之间的差异值,第二:图像分割之后的各个区域。其中区域大小是作为一个阈值来限制分割时的合并。下面简单介绍下图的一下基础。在一维矩阵中有两种连通方式,一种是四连通,也就是一个点和自身的上下左右是连通的,而另外一种是八连通,也就是一个点和自身周围的八个点是连通的。然而,不论是四连通还是八连通都
2015-01-18 10:31:51 836
原创 傅里叶变换与小波变换基础(1)
傅里叶变换实现了信号的时域到频域的变换,然而由于傅里叶变换不具备空间位置信息,因此得到的是一个全局的频率谱,而并没有针对特定位置的频率进行分析。
2015-01-04 22:33:34 1397
原创 小波与滤波器组(1)
低通滤波器(Lowpass Filter)的目的是移除差异保留平均,也就是移除高频保留低频,这个是一个比较直观的定义。利用数学公式进行解释就是,假设L={l(n)}是一个低频滤波器组,如果对L中的所有元素进行累加操作得到的结果不等于0,那么就说L是一个低通滤波器,大多数情况下累加操作的结果等于1。,高通滤波器刚好和低通滤波器相反——为了移除平均而保留差异,也就是说移除低频保留高频。在数学上的解释就
2015-01-01 13:26:05 4884
原创 小波与滤波器组(2)
下采样是间隔一个抽取一个数值,而上采样则是间隔一位插入一个0。对信号x(n)进行下采样得到的y(n)=x(2n)。反过来对x(n)进行上采样得到的y(n)分为两部分,y(2n)=x(n);y(2n+1)=0。从定义来看,上采样之后进行下采样可以得到信号的重构,而返过来似乎不能满足信号的重构。实际上,先进行下采样然后进行上采样同样可以对信号进行重构,只需要下采样的频率不要低于香农定理所规定的频率就可
2015-01-01 13:24:51 2353
原创 小波与滤波器组(3)
右图是整个滤波器组重建原信号的一个过程。则整个过程在Z变换下,课由下列公式进行推导。由上面的公式可知,T(Z)可以转化为两个多项式X(Z)和X(-Z)的和,根据多项式原理;若想要T(Z)=N*X(Z),则需要满足X(-Z)部分等于0,而X(Z)部分不等于0。也就是必须满足上诉等式,重构才能成立。这里第一个等式乘以2,只是为了计算方便,后面的Z的-L次方是常数在Z变换下的结果。逆变换
2015-01-01 13:23:45 2644
原创 香农采样定理及其证明
首先对采样最直观的理解就是,如果采样时间间隔过长那么采样得到的信号将不能重构出原信号。也就是说采样时间间隔越短越好,然而由于物理器件的性能,所以需要知道一个采样时间间隔的阈值。超过这个阈值原信号能够完全恢复,没有超过这个阈值则不能完全恢复。不过香农采样定理的定义肯定不是我说的这么粗糙,下面看一下香农采样定理的定义:从上面的定义来看,貌似有些混乱了。首先需要注意到采样定理的定
2014-12-21 10:01:09 31707 2
原创 Linux内核可加载模块基础(2)
file_operations结构体定义在linux/fs.h文件中,并且包含一系列函数指针这些函数指针最终都会由驱动程序实现的函数来进行填充(由于之前的驱动都只有两个函数,一个在加载时被调用,而另一个则在卸载的时候被调用)。文件操作体结构通用函数如下所示:struct file_operations { struct module *owner; loff_t(*llseek) (st
2014-12-21 08:36:47 661
原创 Linux内核可加载模块基础(1)
内核模块是一个在需要时能够被加载到内核内存空间代码片段,在合适的时候也可以从内核中移除。内核模块和.so的最大的差别是内核模块一定是被加载到内核空间中的,而so文件(共享对象文件)则可能被加载到用户空间。正因为内核模块的动态加载功能使得在不重启的情况下扩展系统的功能成为可能。用户可以通过lsmod命令来查看已经加载到内核中的模块信息,这个命令会获取/proc/modules文件中的信息(内核版
2014-12-20 18:55:05 810
原创 Linux RCU队列(3)树形RCU队列实现代码分析
经过之前的分析基本清楚了整个RCU的结构体,下面就通过分代码来解读RCU的实现。void synchronize_rcu(void){ if (!rcu_scheduler_active) return; wait_rcu_gp(call_rcu);}当rcu_scheduler_active变量将会在第一个任务创建之前由0转换为1.当这个变量等于0的时候,RCU可以假设当前
2014-12-02 00:13:52 2071
原创 Linux RCU队列(2)树形RCU队列实现
因为只用一个全局锁在多处理器系统中会造成很严重的锁竞争问题,一种有效的途径是将锁竞争关系变为一种层次关系(如图1)。图中四个rcu_node结构体都有自己的锁,因此处理器0和处理器1之间将会先竞争底层的锁然后在竞争高层的锁,其他处理器也一样。在grace period期间,只有获取了底层的锁的处理器才有机会获取高层的锁,也就是说只有每对处理器中的最后一个才能够记录相应的grace period转入
2014-12-02 00:02:39 1658
原创 Linux RCU队列(1)经典RCU队列实现
RCU全称Read Copy Update,这是一种对读写锁的优化。当所有对相关数据结构的操作时读者行为时,则通过最高层次的禁止线程调度就可以了,如果需要对这个队列进行写操作,那么可以先将原来的数值复制一份出来,然后对复制出来的数据进行处理,最后在适当的时机进行更新。而更新的适当时机则是所有的处理器上都进行了一次线程切换之后,因为只有这样才能保证整个所有的处理器上的读者都释放了相应的资源。 s
2014-12-01 23:55:58 1489
原创 Linux内核源代码中常见的宏
#define unlikely(x) __builtin_expect(!!(x), 0)#define likely(x) __builtin_expect(!!(x), 1)
2014-11-10 07:30:40 871
蜂鸣器驱动代码
2014-07-02
cap_cam+ffmpeg
2014-05-18
sipdroid开源项目
2015-07-02
graph_segment
2014-12-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人