MLK
posts - 19,comments - 68,trackbacks - 0

摘要: 写了个图片蜘蛛人玩玩,抓了几个网页试试,感觉不不错。核心的代码可能20行也不到,简洁明了阅读全文
posted @ 2012-02-22 14:35 emy_yu 阅读(95) 评论(0) 编辑
摘要: 最近想用中文维基百科的一些文章进行文本分析,于是想爬一些有用的网页下来。起初找了个叫teleport pro的软件,但几经周折还是没找到方法下载指定层的文本(图片可以),而且下下来很多没用的插件,甚是复杂(网上有人说可以实现,但至今未研究明白,还请高手指点!)。于是用python写了段代码获取指定url的网页。这也是第一次接触urllib等库的使用。阅读全文
posted @ 2012-02-22 11:09 emy_yu 阅读(904) 评论(1) 编辑
摘要: 其中的图像旋转是一种常用的数字图像处理技术。由于旋转后图像像素点坐标不再是整数,所以旋转后必须对新的像素点灰度值进行插值运算。目前常用的方法有最近邻插值法、线性插值法和样条插值法。文献介绍,最近邻法速度快,方法简单,但生成图像效果较差;样条插值法计算精度高,效果好,但计算复杂,速度较慢;线性插值法(E.g. 双线性插值法)效果较好,运行时间较短。另外,实现赋值的方法分为正向映射法和反向映射法:正向映射法是指,从原始图像坐标出发,计算出在旋转图像上坐标,然后将原始图像该坐标的灰度值赋给对应旋转图像该坐标点;反向映射法则反之。 本文将分别采用基于最近邻取值的正向映射法、基于最近邻取值的反向映射法、基于双线性插值的反向映射法实现图像旋转,并对比三种方法的效果。阅读全文
posted @ 2012-02-02 22:16 emy_yu 阅读(1533) 评论(4) 编辑
摘要: 今年寒假前完成了读研以来的第二篇paper,导师看过后评价:实验结果和图表都不错,but the writing and English have a big big room to improve. 可见自己的英文论文写作功底还欠缺的很,于是今天参考了一篇“How to write a paper” (原文见http://essaystar.com/paper/download/How.To.Write.A.Paper.pdf),总结一下如何开始写英文科技论文。阅读全文
posted @ 2012-01-29 19:14 emy_yu 阅读(1466) 评论(3) 编辑
摘要: 最近学习遇到瓶颈,主要是编程水平和专业知识跟不上,发现学习图像处理、模式识别,一开始真不能死钻在一个点上不放,还是要尽可能拓展知识面,包括扎实的数学基础,数学分析,概率论,线性代数,常微分方程,运筹学,控制论,复变函数与积分变换这些学科还是得好好学一下,泛函分析,时间序列,小波分析,抽象代数,分形理论也得有一定了解,对基本的数值分析方法和现代优化算法需要熟练掌握,还有常用的机器学习算法。。。顿时又倍感鸭梨>_< 不过看了一堆最近的招聘信息,最基本的还是要先把编程搞搞好,尤其是C++,同时每天坚持学习理论知识。于是今天开始又翻开C++ primer,发现学编程语言就是个死循环,不管这阅读全文
posted @ 2011-04-14 18:38 emy_yu 阅读(610) 评论(3) 编辑
摘要: 在图像处理中,首先要对原始图像进行预处理,即将效果较差的图像处理为尽量符合后续工作的有效图像。这一步主要用到了图像增强技术(Image Enhancement)和图像复原技术(Image Restoration)。图像增强是主观的(subjective),没有特定标准需要增强到什么程度,只要满足用户的需求即可;而图像复原是客观的(objective),需要尽可能恢复为原始图像。今天我主要针对图像复原方法做了实验。阅读全文
posted @ 2011-02-13 00:23 emy_yu 阅读(2627) 评论(6) 编辑
摘要: 编辑器加载中...int cvWaitKey( int delay=0 )参数:delay&mdash;延时的毫秒数。 delay&lt;=0时,函数cvWaitKey无限制的等待按键事件,所以显示图像时,需要在cvShowImage("**.bmp",image)后加上cvWaitKey(0),即该程序停在显示函数处,不运行其他代码;否则,图像无法正常显示。 delay&gt;0时,延迟"delay"ms,返回值为被按键的值,如果超过指定时间则返回-1。在显示视频时这个函数是有用的,用于设置在显示完一帧图像后程序等待"阅读全文
posted @ 2011-02-10 21:34 emy_yu 阅读(638) 评论(0) 编辑
 1 clear;
 2 filenames = dir('E:\file');
 3 N = length(filenames);
 4 j=0;
 5 for i=1:N
 6     [path,name,ext] = fileparts(filenames(i).name);
 7     if strcmp(ext,'.jpg') == 1
 8        
 9         imagedir = strcat('E:\王琳-04-25(new)\MindFind\MindFind\frame\',filenames(i).name);
10         name = filenames(i).name;
11         I = imread(imagedir);
12         [m,n] = size(I);
13        if m==256 && n== 384*3
14            i
15           I = imresize(I,[NaN 300]);
16           R = I(:,:,1);
17           G = I(:,:,2);
18           B = I(:,:,3);
19           [M,N] = size(R);
20           K=double(R);
21           for i=1:300
22               for j=1:300
23                   if (i>50)&&(i<=50+M)
24                       C(i,j) = K(i-50,j);
25                   else
26                       C(i,j) = 0;
27                   end
28               end
29           end
30          C = uint8(C);
31           
32           L=double(G);
33           for i=1:300
34               for j=1:300
35                   if (i>50)&&(i<=50+M)
36                       D(i,j) = L(i-50,j);
37                   else
38                       D(i,j) = 0;
39                   end
40               end
41           end
42             D = uint8(D);
43             
44           T=double(B);
45           for i=1:300
46               for j=1:300
47                   if (i>50)&&(i<=50+M)
48                       E(i,j) = T(i-50,j);
49                   else
50                       E(i,j) = 0;
51                   end
52               end
53           end
54             E = uint8(E);
55             
56           Inew(:,:,1) = C;
57           Inew(:,:,2) = D;
58           Inew(:,:,3) = E;
59           savename = strcat('E:\file',name);
60           imwrite(Inew,savename);
61           
62       end
63     end
64     
65 end

 

posted @ 2012-06-01 14:54 emy_yu 阅读(2) 评论(0) 编辑

原文来自:http://blog.sina.com.cn/s/blog_5e16f1770100h6jl.html

 

解决方案:使用宏包multirow,提供了如下命令:参看http://www.ctan.org/tex-archive/macros/latex/contrib/multirow/

效果图:
LaTeX技巧286:表格合并行的绘制技巧

演示代码:
\documentclass{article}
\usepackage{longtable}
\usepackage{rotating}
\usepackage{multirow}
\begin{document}
\begin{longtable}{| c | c | c | c  | c | c |}
    \hline
    & \multicolumn{5}{| c |}{ } \\
    & \multicolumn{5}{| c |}{\textbf{\large Father's Occupation}} \\
    & \multicolumn{5}{| c |}{ } \\
    \hline
    & & & & & \\
    \multicolumn{1}{|c|}{\textbf{}}
    &  \multicolumn{1}{|c|}{\textbf{}}
    &  \multicolumn{1}{c|}{\textbf{Group A}}
    &  \multicolumn{1}{c|}{\textbf{Group B}}
    &  \multicolumn{1}{c|}{\textbf{Group C}}
    &  \multicolumn{1}{c|}{\textbf{Group D}} \\
    & & & & & \\
     \cline{2-6}
    & & & & & \\
    \multirow{5}{*}{\begin{sideways}{\textbf{\large Mother's Occupation}}\end{sideways}}
    &   \textbf{Group A}   &   $8$      &   $3$      &   $4$      &   $1$   \\
    & & & & & \\
    \cline{2-6}
    & & & & & \\
   &   \textbf{Group B}   &   $3$      &   $3$      &   $0$      &   $1$   \\
    & & & & & \\
     \cline{2-6}
    & & & & & \\
    &   \textbf{Group C}   &   $0$      &   $0$      &   $1$      &   $0$   \\
    & & & & & \\
     \cline{2-6}
    & & & & & \\
    &   \textbf{Group D}   &   $2$      &   $0$      &   $0$      &   $1$   \\
    & & & & & \\
    \hline
    & & & & & \\
    &   \textbf{Total:}      &   \textbf{26}   &   \textbf{10}   &   \textbf{10}   &   \textbf{4}    \\
    & & & & & \\
    \hline
    \end{longtable}
  
  
    \end{document}

posted @ 2012-05-31 21:14 emy_yu 阅读(11) 评论(0) 编辑

原文转自:http://blog.csdn.net/apple_guet/article/details/6721186

 

 代码永远会有BUG,在这方面没有最好只有更好。高效是程序员必须作到的事情,无错是程序员一生的追求。复用、分而治之、折衷是代码哲学的基本思想。模块化与面向对象是实现高效无错代码的方法。高效无错代码需要思想与实践的不断反复。

1.2.1 命名约定

    命令规范基本上采用了微软推荐的匈牙利命名法,略有简化。

    1. 常量

            常量由大写字母和数字组成,中间可以下划线分隔,如 CPU_8051。

    2. 变量

            变量由小写(变量类型)字母开头,中间以大写字母分隔,可以添加变量域前缀(变量活动域前缀以下划线分隔)。如: v_nAcVolMin(交流电压最小值)。变量域前缀见下表局部变量,如果变量名的含义十分明显,则不加前缀,避免烦琐。如用于循环的int型变量 i,j,k ;float 型的三维坐标(x,y,z)等。

    3. 函数名一般由大写字母开头,中间以大写字母分隔,如SetSystemPara。

        函数命名采用动宾形式。如果函数为最底层,可以考虑用全部小写,单词间采用带下划线的形式。如底层图形函数:pixel、lineto以及读键盘函数get_key 等。

    4. 符号名应该通用或者有具体含义,可读性强。尤其是全局变量,静态变量含义必须清晰。

          C++中的一些关键词不能作为符号名使用,如class、new、friend等。符号名长度小于31个,与ANSI C 保持一致。命名只能用26个字母,10个数字,以及下划线‘_’来组成,不要使用‘$’‘@’等符号。下划线‘_’使用应该醒目,不能出现在符号的头尾,只能出现在符号中间,且不要连续出现两个。

    5. 程序中少出现无意义的数字,常量尽量用宏替代

 1.2.2 使用断言

        程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用。断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。以下是一个内存复制程序,在运行过程中,如果assert的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。

         //复制不重叠的内存块

        void memcpy(void *pvTo, void *pvFrom, size_t size)

       {

               void *pbTo = (byte *) pvTo;

               void *pbFrom = (byte *) pvFrom;

               assert( pvTo != NULL && pvFrom != NULL );

               while(size - - > 0 )

               *pbTo + + = *pbFrom + + ;

                return (pvTo);

        }

        assert不是一个仓促拼凑起来的宏,为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。所以assert不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。

          以下是使用断言的几个原则:

        1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。

        2)使用断言对函数的参数进行确认。

        3)在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。

        4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

    1.2.3 优化/效率规则

        规则一:对于在中断函数/线程和外部函数中均使用的全局变量应用volatile定义。

        例如:volatile int ticks;

         void timer(void) interrupt 1 //中断处理函数

         {

                ticks++

         }

         void wait(int interval)

         {

                tick=0;

                while(tick<interval);

          }

        如果未用volatile,由于while循环是一个空循环,编译器优化后(编译器并不知道此变量在中断中使用)将会把循环优化为空操作!这就显然不对了。

        规则二:不要编写一条过分复杂的语句,紧凑的C++/C代码并不见到能得到高效率的机器代码,却会降低程序的可理解性,程序出错误的几率也会提高。

        规则三:变量类型编程中应用原则:

             尽量采用小的类型(如果能够不用“Float”就尽量不要去用)以及无符号Unsigned类型,因为符号运算耗费时间较长;

             同时函数返回值也尽量采用Unsigned类型,由此带来另外一个好处:避免不同类型数据比较运算带来的隐性错误。

1.2.4 其他规则

        规则一:不要编写集多种功能于一身的函数,在函数的返回值中,不要将正常值和错误标志混在一起。

        规则二:不要将BOOL值TRUE和FALSE对应于1和0进行编程

        大多数编程语言将FALSE定义为0,任何非0值都是TRUE。Visual C++将TRUE定义为1,而Visual Basic则将TRUE定义为-1。

       例如:BOOL flag;

                   …

                  if(flag) {  // do something }    // 正确的用法

                  if(flag==TRUE) { // do something } // 危险的用法

                  if(flag==1) { // do something } // 危险的用法

                  if(!flag) { // do something } // 正确的用法

                  if(flag==FALSE) { // do something } // 不合理的用法

                  if(flag==0) { // do something } // 不合理的用法

        规则三:小心不要将“= =”写成“=”,编译器不会自动发现这种错误。

        规则四:建议统一函数返回值为无符号整形,0代表无错误,其他代表错误类型。

1.3 模块化的C编程

        C语言虽然不具备C++的面向对象的成分,但仍应该吸收面向对象的思想,采用模块化编程思路

        面向对象的思想与面向对象的语言是两个概念。非面向对象的语言依然可以完成面向对象的编程,想想C++的诞生吧!C++没有理由对C存在傲慢与偏见,不是任何场合C++方法都是解决问题的良药,譬如面对嵌入式系统效率和空间的双重需求。注意我们谈的是方法,而不是指编译器。

        C在软件开发上存在的首要问题是缺乏对数据存取的控制(封装),C编程者乐而不疲的使用着大量extern形式的全局变量在各模块间交换着数据。这样多个变量出现在多个模块中,剪不断理还乱,直到有一天终于发现找一个“人”好难。一个东西好吃,智者浅尝之改进之,而愚者只会直至撑死。应在C上多下功夫,还是看看C语言如何实现模块化编程方法,在部分程度上具备了OO特性封装与多态。

        在具体阐述之前,需要明确生存期与可见性的概念。生存期指的是变量在内存的生存周期,可见性指的是变量在当前位置是否可用。两者有紧密联系,但不能混为一谈。一个人存在但不可见只能解释成上帝或灵魂,一个变量存在但不可见却并非咄咄怪事,模块化方法正是利用了静态函数、静态变量这些“精灵”们特殊的生存期与可见性。

        最后需要明确一点的是这里的模块是以一个.C文件为单位。

        规则一:利用函数命名规则和静态函数

        模块中不被其他模块调用的内部函数采用以下命名规则:用全部小写,单词间采用带下划线的形式。如底层图形函数:pixel、lineto以及读键盘函数get_key等。这些函数应定义为static静态函数,这样在其他模块错误地调用这些函数时编译器能给出错误(如BC编译器)。(注意:有些编译器不能报告错误,但为了代码风格一致和函数层次清晰,仍建议这样作)。

        规则二:利用静态变量

        模块中不能被其他模块读写的全局变量应采用static声明,这样在其他模块错误地读写这些变量时编译器能给出警告(C51编译器)或错误(BC编译器)。

        规则三:引入OO接口概念和指针传参模块间的数据接口(也就是函数)应该事先较充分考虑,需要哪些接口,通过接口需要操作哪些数据,尽量作到接口的不变性。

        模块间地数据交换尽量通过接口完成,方法是通过函数传参数为了保证程序高效和减少堆栈空间,传大量参数(如结构)应采用传址的方式,通过指针作为函数参数或函数返回指针,尽量杜绝extern形式的全局变量,请注意是extern形式的全局变量,模块内部的全局变量是允许和必须的。

        传指针参数增加的开销主要是作参数的指针和局部指针的数据空间(嵌入式系统(如C51)往往由于堆栈空间有限,函数参数会放到外部RAM的堆栈中),增加的代码开销仅是函数的调用,带来的是良好的模块化结构,而且使用接口函数会比在代码中多处直接使用全局变量大大节约代码空间。对于需要频繁访问的变量如果仍采用接口传递,函数调用的开销是巨大的,这时应考虑仍采用extern全局变量。

        以下演示了两个C模块交换数据:

        //Module1.C

       OneStruct* void GetOneStruct(void); //获取模块1数据接口

       void SetOneStruct(OneStruct* pOneStruct); //写模块1数据接口

       struct OneStruct

       {

                  int m¬_imember;

                  //……

       }t1;

       //模块1的数据//t1初始化代码…..

       OneStruct* void GetOneStruct(void)

       {

              OneStruct* pt1; //只需定义一个局部变量

               t1.imember=15;

               pt1=&t1;

               return pt1;

        }

         void SetOneStruct(OneStruct* pOneStruct)

         {

                t1.imember=pOneStruct->imember;

               //…….

        }

       //Module2.C

      void OperateOneStruct(void); //模块2通过模块1提供的接口操作模块1的数据

      OneStruct* void GetOneStruct(void);

       void SetOneStruct(OneStruct* pOneStruct);

      void OperateOneStruct(void)

      {

           OneStruct* pt2; //只需定义一个局部变量

           pt2=GetOneStruct(); //读取数据

           SetOneStruct(pt2); //改写数据

      }

        采用接口访问数据可以避免一些错误,因为函数返回值只能作右值,全局变量则不然。

       例如 cOneChar == 4; 可能被误为cOneChar = 4;

        规则四:有限的封装与多态

        不要忘记C++的class源于C的struct,C++的虚函数机制实质是函数指针。为了使数据、方法能够封装在一起,提高代码的重用度,如对于一些与硬件相关的数据结构,建议采用在数据结构中将访问该数据结构的函数定义为结构内部的函数指针。这样当硬件变化,需要重写访问该硬件的函数,只要将重写的函数地址赋给该函数指针,高层代码由于使用的是函数指针,所以完全不用动,实现代码重用。而且该函数指针可以通过传参数或全局变量的方式传给高层代码,比较方便。

      例如:

        struct OneStruct

        {

               int m¬_imember;

               int (*func)(int,int);

               //……

       }t2;

posted @ 2012-05-19 23:39 emy_yu 阅读(16) 评论(0) 编辑

原文转自http://blog.csdn.net/c395565746c/article/details/6086966

 

float acos(float x)

参数x的范围为-1.0f到1.0f之间,返回值范围在0.0f到3.141592653f之间,值得注意的是:当x超出[-1.0f, 1.0f]这个范围时此函数将返回一个-1.#IND000值,代表无穷小而编译器会不给出任何提示,通常此将会导致程序错误或崩溃,所以以后要注意数学函数的参数范围了.

可以通过以下代码进行调试:

 float test = acos(1.0001f)
 if (test != test)
 {
       cout << "错误出现" << endl;
 }

昨天遇到的-1.#IND000,问余衍炳师兄,告诉我这是无穷小。但是我想用if(a==-1.#IND000)去判断,编译不过,呵呵。

现在找到方法了浮点数越界或者无效-1.#IND000   ,不过方法有点怪,astone指出,b!=b应该是恒为false,但在这个情况下竟然是true浮点数越界或者无效-1.#IND000

 float a=10;
 float b=a/0;
 if( b > 0.0f ||b != b)
  printf("%f",b);

这个可以判断1.#INF000

 float a=-10;
 float b=a/0;
 if( b < 0.0f ||b != b)
  printf("%f",b);

这个可以判断-1.#IND000

加b!=b只用于.net 2003,在vC++6.0下不用。

       使用类似于pow, exp等等函数时常会产生一个无效数字1.#IND00,在VC下可以通过与一个确定数字比较大小来判断是否产生了无效数字,但这个方法在DEV-CPP下却是行不通的。

其实解决办法很简单,使用   float.h中一个函数_isnan即可:

int _isnan(double x);  
  
当x是一个无效值(NaN, Not a Number) 时,返回非零值
否则返回0.

一般可能是除数为零,使用数组时也经常出现这种情况

posted @ 2012-05-14 08:40 emy_yu 阅读(36) 评论(0) 编辑

一篇关于方差、协方差与相关系数很详细的介绍

原文来自http://www.math.zju.edu.cn/Probability/course/chapter3-2.htm

主要内容:

一、方差

二、协方差

三、相关系数

四、矩

 


posted @ 2012-03-14 15:47 emy_yu 阅读(28) 评论(0) 编辑
摘要: 原文来自:http://blog.163.com/haitao_gan@126/blog/static/8248124920109208543766/现有的一些人脸数据库2010-10-20 08:54:03|分类:学习|标签:database人脸facepetscmu|字号订阅在国际上已有的一些人脸数据库:Yale人脸库(美国):耶鲁大学,15人,每人11张照片,主要包括光照条件的变化,表情的变化等。ORL人脸库(英国):剑桥大学,40人,每人10张照片,包括表情变化,微小姿态变化,20%以内的尺度变化。FERET人脸库(美国):为 了促进人脸识别算法的研究和实用化,美国国防部的Counte阅读全文
posted @ 2012-02-22 20:09 emy_yu 阅读(98) 评论(1) 编辑
摘要: 写了个图片蜘蛛人玩玩,抓了几个网页试试,感觉不不错。核心的代码可能20行也不到,简洁明了阅读全文
posted @ 2012-02-22 14:35 emy_yu 阅读(95) 评论(0) 编辑
摘要: 最近想用中文维基百科的一些文章进行文本分析,于是想爬一些有用的网页下来。起初找了个叫teleport pro的软件,但几经周折还是没找到方法下载指定层的文本(图片可以),而且下下来很多没用的插件,甚是复杂(网上有人说可以实现,但至今未研究明白,还请高手指点!)。于是用python写了段代码获取指定url的网页。这也是第一次接触urllib等库的使用。阅读全文
posted @ 2012-02-22 11:09 emy_yu 阅读(904) 评论(1) 编辑
摘要: 其中的图像旋转是一种常用的数字图像处理技术。由于旋转后图像像素点坐标不再是整数,所以旋转后必须对新的像素点灰度值进行插值运算。目前常用的方法有最近邻插值法、线性插值法和样条插值法。文献介绍,最近邻法速度快,方法简单,但生成图像效果较差;样条插值法计算精度高,效果好,但计算复杂,速度较慢;线性插值法(E.g. 双线性插值法)效果较好,运行时间较短。另外,实现赋值的方法分为正向映射法和反向映射法:正向映射法是指,从原始图像坐标出发,计算出在旋转图像上坐标,然后将原始图像该坐标的灰度值赋给对应旋转图像该坐标点;反向映射法则反之。 本文将分别采用基于最近邻取值的正向映射法、基于最近邻取值的反向映射法、基于双线性插值的反向映射法实现图像旋转,并对比三种方法的效果。阅读全文
posted @ 2012-02-02 22:16 emy_yu 阅读(1533) 评论(4) 编辑
摘要: 今年寒假前完成了读研以来的第二篇paper,导师看过后评价:实验结果和图表都不错,but the writing and English have a big big room to improve. 可见自己的英文论文写作功底还欠缺的很,于是今天参考了一篇“How to write a paper” (原文见http://essaystar.com/paper/download/How.To.Write.A.Paper.pdf),总结一下如何开始写英文科技论文。阅读全文
posted @ 2012-01-29 19:14 emy_yu 阅读(1466) 评论(3) 编辑
仅列出标题  下一页