自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

lifesider

人生就是一次在自我迷失中寻找自我的长途旅行

  • 博客(26)
  • 收藏
  • 关注

原创 解决Linux下内联汇编的宏融合寻址问题

Windows下生成DLL时,直接使用内联汇编的宏融合(Macro Fusion)模式,可以提高效率,如__asm {  movdqa    xmm0, g_data0;  paddw      xmm0, g_data1;  movdqa    g_data2, xmm0;} 这里的g_data0|g_data1|g_data2都是全局变量。 类

2016-01-14 18:02:34 1955

原创 资源链接预存

这是保存一下常用的图像处理与机器视觉相关的资源链接。http://www.ipol.im/ 开源的图像处理及分析的杂志,含有对算法的分析及实现http://people.csail.mit.edu/abadams/http://www.cse.cuhk.edu.hk/~leojia/http://www.disneyresearch.com/

2015-10-13 11:20:08 2002

原创 Ubuntu 12.04 配置intel c++ compiler开发环境

之前一直在windows下开发,写了很多内嵌汇编,现在要移植到Linux下,幸好intel编译器支持Linux,这里以Ubuntu 12.04作为系统平台。首先下载你想使用的intel编译器版本,我这里下载的是intel c++ composer xe 2013 sp1 update 1http://software.intel.com/en-us/c-compilers/

2013-12-27 10:39:58 11172 2

原创 LOCK instruction and InterLocked* functions

一个最简单的例子,在多线程环境中,我们会常常使用到”引用计数”的情况,如变量int g_ref = 0;全局变量g_ref的读写是多线程不安全的,这是因为相关操作是一个read-modify-write过程,因此需要使用同步机制,如考虑Critical Section、Mutex,于是有如下最直观的两种解决方案:(1)CRITICAL_SECTION g_cs;EnterCri

2013-01-20 13:27:07 3187

翻译 双边滤波器在灰度和彩色图像处理中的应用

原文链接:http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html版权归原作者所有,转载请注明出处!简介思路高斯案例黑白图像应用实验彩色图像应用实例参考论文简介滤波也许可以说是图像处理和计算机视觉最基础的操作。术语”滤波“最宽泛的理解,

2013-01-02 13:47:05 12776 2

原创 SSE2实现HAAR小波变换(dwt2与idwt2)

wiki链接:http://en.wikipedia.org/wiki/Haar_wavelet 可用SSE2实现HAAR小波变换,达到实时,关于HAAR小波的介绍可参考以上维基链接 参考MATLAB中dwt2与idwt2的函数原型,基于OpenCV的框架进行了汇编优化实现HAAR小波也可用于图像的压缩,将CH,CV,CD中的分量值小于某一阈值则归为0,从而这三个矩阵将成为稀疏矩阵

2012-12-10 13:40:12 7631 1

原创 使用递归高斯滤波器实现快速高斯模糊

高斯窗常用于对图像进行模糊或低通滤噪,但是随着高斯半径的增加,时间消耗会逐级增加如高斯半径为N时,计算每个输出采样点需要计算的乘法次数为(2N+1)*模糊方向数,加法次数为2N*模糊方向数,这种情况下,当N=100时,甚至更大时,计算量是非常大的,即使进行SIMD指令集优化,

2011-08-25 16:37:00 10119 2

原创 STL源码解析 - sort

模板函数sort有两个重载版本template inline void sort(_RanIt _First, _RanIt _Last); template<class _RanIt, class _Pr> inline void sort(_RanIt _Firs

2011-07-17 13:24:29 4914

原创 STL源码解析 - make_heap

模板函数make_heap具有如下两个版本templatevoid make_heap(_RanIt _First, _RanIt _Last); templatevoid make_heap(_RanIt _First, _RanIt _Last, _Pr _Pred)

2011-07-06 21:11:31 6498

原创 STL源码解析 - sort_heap

模板函数sort_heap具有如下两个版本templatevoid sort_heap(_RanIt _First, _RanIt _Last);templatevoid sort_heap(_RanIt _First, _RanIt _Last, _

2011-07-04 22:05:13 5932

原创 无锁的数据结构(Lock-Free)及CAS(Compare-and-Swap)机制

当同时存在读写线程时,默认情况下是不保证线程安全的,因而需要利用信号量来进行线程同步(Synchronization),如关键代码段、互斥体等,同时操作系统也提供了相应的API。然而同步并不总是满足条件的且有效率的,比如陷入内核时会有性能损失、死锁、活锁以及资

2011-07-03 22:10:52 19953 1

原创 STL源码解析 - nth_element

 nth_element 模板函数具有两个版本 templatevoid nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last);templatevoid nth_element(_RanIt _First, _RanIt _Nth, _RanIt _Last, _Pr _Pred);其功能是对区间 [_First, _Last) 的元素

2011-07-02 13:03:07 13393 3

原创 自动矢量化编译优化技术(Automatic Vectorization)

自动矢量化技术,是编译器代码优化技术的一种,即在不改变C/C++源代码的情况下,自动编译产生使用单指令多数据(Single Instruction Multiple Data,SIMD)指令集的二进制码,包括MMX,SSE,SSE2,SSE3,SSSE3,SSE4,AVX,而不是程序员手动编写汇编层次的优化代码。 举例如下:float a[N], b[N], c[N];for(int i=0;

2011-06-27 21:49:00 5847

原创 更新词汇至Unigram词表进行识别

在上一篇文章中提到通过在运行时修改某一词汇至特定词汇进行识别,然而当需要测试的新词汇较多时,并且新增词汇相近时,对于运行时手动修改的工作量是巨大的。为了具有更好的扩展性,这里提出一种对新增词汇进行统一处理的方法。 在语言模型目录(及与DMP模型和DICT词典文件相同的目录)下新增一个文本文件,如new_dict.txt,对于需要新增的词汇只需要手动加入到new_dict.txt中,一行一个

2011-06-23 23:21:00 3094

原创 在语言模型文件中更新词汇以提高识别正确率

完成CMU Sphinx Toolkit到UNICODE的移植后,由于其自身支持的中文词汇太少且过于简单,实际生活中的很多词汇无法识别,由于其缺少开发文档,只能在代码跟踪的过程里心烦了。 于是想,肯定需要在词典文件中增加新词汇吧,如果其本身是按照Ciphone序列进行识别的话,应该就能识别出新词汇。后来在词典文件中增加了几个特定词汇,发现识别结果未发生任何变化。 于是又对DMP

2011-06-18 10:33:00 4113 2

原创 实现自定义的 STL allocator

STL allocator 的注释讲解请见:http://blog.csdn.net/lifesider/archive/2011/06/06/6527776.aspx 这里实现的自定义allocator是继承自std::allocator,因为两者有公共部分,对于完全重写的allocator,下面的内容就不用读了。 上源码#include templateclas

2011-06-06 12:13:00 9061

原创 深入理解 STL allocator

由于std::set,std::multiset,std::map,std::multimap四种容器的插入删除操作性能高并且自动排序,在很多时候比如需要动态操作时往往会使用它们,然后由于容器内部使用的是节点,每次的插入或删除都要调用new或delete,往往容易造成碎片和性能下降,于是自定义的allocator出现了。这篇文章的目的就是详细讲解std::allocator的内部结构,为实现自

2011-06-06 12:00:00 12121

原创 C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)

意图:使用派生类作为模板参数特化基类。 与多态的区别:多态是动态绑定(运行时绑定),CRTP是静态绑定(编译时绑定) 在实现多态时,需要重写虚函数,因而这是运行时绑定的操作。然而如果想在编译期确定通过基类来得到派生类的行为,CRTP便是一种独佳选择,它是通过派生类覆盖基类成员函数来实现静态绑定的。 范式:class derived : public base

2011-06-06 10:04:00 8656 2

原创 使用SSE4指令集优化双线性插值图像缩放

原理:p = p(0) *(1-t) + p(1) * t = p(0) + (p(1) - p(0)) * t水平方向和垂直方向均进行线性插值,缩放系数分别计算,由于水平和垂直成正交关系,因而与计算的先后次序无关。 缩放比例系数:double scale_x = (des_width - 1)/(src_width - 1);double scale_y = (des_height - 1)/(

2011-06-05 21:19:00 6474 3

原创 C++惯用法:通过成员模板实现隐式转换(Coercion by Member Template)

往往将子类指针转换成父类指针进行操作是常见的且是非常有用的,如下class base {};class derive : public base {};base* pb = NULL;derive* pd = NULL;pb = pd;  同样,对于内建类型(built-in type)的隐式转换也是常见的,如下char c = A;short

2011-06-05 12:43:00 3360

原创 以单词为单位反转字符串,要求不申请任何空间

问题描述:存在一个可读写的字符串,其中包括若干单词,单词间以空格区分,要求以单词为单位对字符串进行反转。 算法思想:(1)利用异或运算可以进行不申请空间进行字符交换(2)利用递归的思想(3)使用strchr函数区分单词 解决方案:(1)利用递归和异或运算进行字符交换,这一步将完成字符串的整体反转// 递归进行字符交换void recursive_swap_char(char* lhs, cha

2011-06-05 10:14:00 2438

原创 使用PMULHW或PMADDWD指令对RGB颜色转换至YCbCr颜色的汇编优化

在视频处理中,常会遇到颜色空间的转换(高清和标清下的转换公式不同),下面是使用SIMD指令对RGBA颜色转换至YUYV颜色的汇编优化假设转换公司如下:Y = Yr * R + Yg * G + Yb * BU = Ur * R + Ug * G + Ub * BV = Vr * R + Vg * G + Vb * B转换后,这里选择直接丢弃第二个像素的U和V,这里暂不考虑A通常的存储为了考虑性能,通常会将浮点系数放大成短整型系数,经放大后最后的结果需进行0.5的补偿(同样进行放大)下面对使用pmulhw和p

2011-05-27 21:59:00 2458

原创 函数模板中使用类型萃取(traits)替换类型推导(deduce)

以max函数为例,通常是以宏的形式出现的#define max(a, b) (((a) > (b)) ? (a) : (b))但是在C++中,我们可能用模板替换它(对于内建类型,我们可以不写const&)templateT const& max(T const& a, T const& b){    return (a > b ? a : b);}当然我们可能提供两个模板参数,但这里我们演示的是只提供一个模板参数的解决方法很多时间我们会使用0的情况,于是下面的使用将导致编译失败,原因是编译器推导出doubl

2011-05-27 07:57:00 2143

原创 struct、class和STL的统一内存管理

利用C++的new和delete操作符重载特性,可以对自定义的struct和class进行统一内存管理,再加上STL allocator的开放特性,便可以将STL容器对象的内存管理并入struct和class的内存管理,进而将这三者的内存管理统一。首先实现自定义的内存管理算法框架,开放接口为allocate和deallocate,实现库为memmgr.dllclass memory_manager{public:      virtual void* allocate(size_t size) = 0;  

2011-05-24 21:02:00 1666

原创 含生存期的矩形利用率问题求解

问题描述:已知一宽为W高为H的目的矩形,时间序列为t0,t1,……,在时间tn时系统随机产生一宽为Wn(不超过W)高为Hn(不超过H)的小矩形,并且需将此小矩形放至目的矩形中,而且小矩形的生存期未知(即在同一时刻,产生一个小矩形时有可能同时需销毁若干个已存在小矩形)。寻找一算法使得在一段时间t内,目的矩形被重置的次数最少?解决方案:此问题类似于内存管理问题:随机出现的new(或malloc)和delete(或free)分别分配和释放内存,一段时间后,内存碎片的产生便会导致某一时刻new(或malloc)返回

2011-05-22 14:39:00 763

原创 使用宏对产品版本号和文件版本号进行统一管理

问题描述:在每次发布版本时,最简单的就是在资源(*.rc)文件中修改当前文件和产品的版本号(如a.b.c.d),但是随着时间的推移,需要发布的DLL越来越多,于是每次修改时意味更多的时间和精力消耗,你得一个一个的打开各个DLL中的资源文件,然后修改,而且一不小心还会将版本号弄错。解决方案:多次这样之后,我觉得每次都要修改各个DLL很繁琐,既然VC支持宏开关,何不使用宏试一试呢?新增一个文件version_ctrl.h,比如对于X.dll,定义如下宏:// product#define PRODUCTVERS

2011-05-21 09:14:00 1965 1

空空如也

空空如也

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

TA关注的人

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