显示下一条  |  关闭

Thinking

若是真有决心,就不要瞻前顾后,以最积极的态度努力争取机会才是王道!

 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
 

OpenCV2.2分水岭算法阅读笔记

2011-9-6 22:01:39 阅读141 评论2 62011/09 Sept6

函数原型:

CV_IMPL void

cvWatershed( const CvArr* srcarr, CvArr* dstarr )

参数srcarr为待分割图像,类型为CV_8UC3;参数dstarr为各点标号,类型为CV_32SC1,既作输入也作输出。dstarr中有部分像素已经手动指定了标号,分割过程就是将这些标号扩展到其他无标号像素上。

基本思想

一组队列:共256个队列,分别对应与领域像素差值为di(0<=di<=255)的像素集合。按di值从小到大处理各队列,相当于水自底而上的蔓延。

两种标记:-1表示该像素为边界(分水线);-2表示该像素已在队列中等待处理,稍后会为其分配新的标号。

工作流程

第一批处理对象:与标号>0(即markers中已指定标号)的像素相邻且标号为0(即无标号)的像素。按其与4邻域内有标号像素的最小差值di加入对应队列。

按di值从小到大处理各队列。取出队首像素,若其4邻域内仅有一种标号,则给它也打上相同标号;否则,将其划入分水线,打上标记-1。

若前一步中的队首像素未被划入分水线,则将其周围的0值像素按与此像素的插值加入相应队列。转到第2步继续处理,直到所有队列都为空。

若干细节

具体实现第1步中,无标号像素与4邻域内有标号像素最多可能产生4个差值,但最后选择了对应于最小差值的队列加入。如果无标号像素4邻域内有两个有标号像素,当这两个有标号像素

作者  | 2011-9-6 22:01:39 | 阅读(141) |评论(2) | 阅读全文>>

C/C++中的默认参数

2010-4-3 11:01:32 阅读685 评论1 32010/04 Apr3

  不知道是何时留下的印象觉得C语言里的函数支持默认参数,先鄙视自己一下,然后记记流水帐:

C语言中的函数既不支持默认参数,也不支持函数重载C++支持默认参数,默认参数可以在函数定义处,也可以放在函数声明处C++中默认参数若放在函数定义处,则声明处不得再指定默认参数C++中若在函数声明处指定默认参数,则不同文件中的声明可以指定不通的参数

作者  | 2010-4-3 11:01:32 | 阅读(685) |评论(1) | 阅读全文>>

慢一拍的feof

2010-3-2 15:11:45 阅读228 评论0 22010/03 Mar2

  写了个代码统计的小程序,能够正确统计代码行数和注释行数,但是总行数总是比实际的文件多出一行。经Debug发现是因为feof慢了一拍。当fgets读过最后哦一行之后,feof()仍然返回的是0,又一次读出错之后feof才检测到文件结束。下面用代码来说明:

FILE * fp = fopen("test~", "r");  int cnt = 0;  while (EOF != fgetc(fp))  {      cnt++;  }  printf("feof: %d\n", cnt);    fseek(fp, 0, SEEK_SET);  cnt = 0;  while (!feof(fp))  {      fgetc(fp);      cnt++;  }  printf("feof: %d\n", cnt);

作者  | 2010-3-2 15:11:45 | 阅读(228) |评论(0) | 阅读全文>>

《C专家编程》学习笔记——第2章

2010-2-23 9:21:16 阅读175 评论0 232010/02 Feb23

1.switch语句中各个case和default的顺序可以是任意的,即使default出现在case之前,还是会先判定所有的case

2.switch的左花括号之后可以声明一些局部变量,但对其赋值没有意义,因为这部分语句没有入口case,不会被执行,仅仅是分配了存储空间。即便是声明语句中对变量的初始化也是无效的(gcc 4.4.1中验证)。

3.相邻的字符串常量将被自动合并成一个字符串,如下面的代码所示:

char * aszName[] = {      "Lucy",      "Lily",      "Lilei"      "Jim"  };  

char * aszName[] = { "Lucy", "Lily", "Lilei" "Jim" };

由于在"Lilei"的后面没有逗号,所以这个数组最后实际上包含3个元素,而aszName[2]指向的字符串就是"LileiJim",即上述代码中后两个字符串被合为一个了。

4.让一段代码第一次执行时的行为欲以后执行时不同,用于输出列表中的分隔符时能有效减少分支和条件测试(关键是static的使用):

generate_initializer(char * string)  {

作者  | 2010-2-23 9:21:16 | 阅读(175) |评论(0) | 阅读全文>>

对C/C++中const的理解

2010-2-15 12:55:53 阅读166 评论0 152010/02 Feb15

  C语言中的const限定符容易让人产生常量的错觉,实际上const只是限定了一个变量的符号是“只读”的,而该变量的内存区域并非是不可写的,如下面的代码所示(本文中代码均使用gcc 4.4.1编译):

const int a = 1;

//a = 2;

int * p = &a;

*p = 2;

printf("%d\n", a);

在这个例子中,被注释掉的第二行语句会产生一个编译错误。第3、4行语句虽然得到一个警告,却成功的修改了const变量a的值。但在C++中,情况就不同了,const变量的确就是一个常量。看下面的代码:

const int a = 1357;

int b = a;

存为.c文件,用gcc汇编所得代码如下:

movl $1357, -8(%ebp)

movl -8(%ebp), %eax

存为.cpp文件,用gcc汇编所得代码如下:

movl $1357, -8(%ebp)

movl $1357, -4(%ebp)

可以看到,C语言中对const变量a的引用即是对a所占内存空间中值的引用,而C++中对a的引用则是对常量1357的引用(与宏定义类似,但也不尽相同,例如const变量提供了类型检查等)。从这里也可以知道,本文中第一个代码片段无法在C++中编译通过。

  接下来再对带有const限定的指针做一点说明:

const int a = 1;

int b = 2;

const int * p = &a;

int * const q = &b;

作者  | 2010-2-15 12:55:53 | 阅读(166) |评论(0) | 阅读全文>>

转个Linux下配置NAT网关的文章

2010-2-3 19:27:21 阅读150 评论0 32010/02 Feb3

原文链接

Howto use NAT on Fedora Core 9 machine with iptables

Network Address Translation is a technique to masquerade IP addresses on your internal LAN to the outside world. In other words; the outside world will not be able to look into your network.

This technique is easy to setup and maintain, saves IP addresses and is likely more secure that pure routing. To set it up, you require:

A Linux machine, for this example Fedora Core 9Two network cards, eth0 attached to you LAN, eth1 connected to the internet.A little bit of Linux/UNIX knowledge

作者  | 2010-2-3 19:27:21 | 阅读(150) |评论(0) | 阅读全文>>

无线网卡终于开始干活了

2010-1-28 10:40:47 阅读162 评论1 282010/01 Jan28

  从上上个月装好无线网卡驱动至今,已经整整两个月了。虽然找到了设备,但似乎并不能工作,由于一直用不着,也就没再折腾。现在回家了,两个笔记本、一个网口,必须得用无线网卡了。

  先是全面升级了一下系统(在学校是舍不得流量的做这事的),然后重新编译了网卡驱动,接着就尝试联网。

  三台机器,两个Windows(以下称W1、W2)、一个Linux(“问题”机,以下称L)。使用L创建了无线网络,然后W1、W2均找到并连上了该网络,W1与W2可以互通,L显示连上了该,但始终ping不通。摸索了N久,才发现可能是密码的问题。L上的密码类型选的是WEP 128,而W1、W2上使用的密码应该对应L上的WEP 40/128类型。但起初试了几次也没能成功,今天开机居然连上了,估计是需要重启机器的缘故。再重启,依旧在干活!太爽了,搞定了网络,可以开始干正事了!

作者  | 2010-1-28 10:40:47 | 阅读(162) |评论(1) | 阅读全文>>

马云给正在奋斗的人的精典语句(转)

2010-1-2 23:24:02 阅读132 评论0 22010/01 Jan2

原文地址:http://topic.csdn.net/u/20091231/10/59b195d8-664d-4f7b-b0ae-1cafb0b8f8de.html?78524



*今天很残酷,明天更残酷,后天很美好,但是绝大多数人死在明天晚上,见不着后天的太阳。?

*最大的失败是放弃,最大的敌人是自己,最大的对手是时间。?

*30%的人永远不可能相信你。不要让你的同事为你干活,而让我们的同事为我们的目标干活,共同努力,团结在一个共同的目标下面,就要比团结在你一个企业家底下容易的多。所以首先要说服大家认同共同的理想,而不是让大家来为你干活。?

*上世纪80年代挣钱靠勇气,90年代靠关系,现在必须靠知识能力!?

*在我看来有三种人,生意人:创造钱;商人:有所为,有所不为。企业家:为社会承担责任。企业家应该为社会创造环境。企业家必须要有创新的精神。?

*发令枪一响,你是没时间看你的对手是怎么跑的。只有明天是我们的竞争对手。?

1、免费,是世界上最贵的东西。?

的确,免费是个很诱人的东西,最显著的例子却不是马云也不是阿里巴巴,而是马化腾和他的QQ。从98年开始,QQ就开始提供免费的即时聊天账号和软件下载,并且在功能上不断完善自己,直到有一天,那个胖企鹅说自己要收费了,我们才恍然大悟——你已经离不开他,你身边的所有人都在用QQ,从警察到****,无一例外。而直到现在,腾讯还保持着这个传统,每个业务初期都是免费的,瞄准现在年轻人爱时尚爱攀比的心

作者  | 2010-1-2 23:24:02 | 阅读(132) |评论(0) | 阅读全文>>

六维空间Transmission配置

2010-1-2 13:29:49 阅读1671 评论0 22010/01 Jan2

  传说Transmission已经支持IPv6了,但是大多数Linux系统上默认安装的版本都没有提供这个支持,需要自己修改源代码重新编译。网上搜到的很多文章给出的解决办法都是修改libtransmission/web.c,然而仅仅如此在六维上还是行不通。

1. 下载Transmission的源码

  可能有些人上不了国外网站,不过163的镜像应该都能访问的:

  http://mirrors.163.com/gentoo/distfiles/transmission-1.76.tar.bz2

2. 解压

  tar xvf transmission-1.76.tar.bz2

3. 修改两处代码

  进入源码目录,找到libtransmission/web.c文件,搜索如下代码:

  curl_easy_setopt( easy, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

  将CURL_IPRESOLVE_V4改为CURL_IPRESOLVE_V6(仅支持IPv6),或者CURL_IPRESOLVE_WHATEVER(同时支持IPv6和IPv4)

  这对大多数支持IPv6的BT网站来说都已经足够了,也是网上大部分文章给出的解决方案,但要在六维使用,还需要修改另外一个文件:

  找到libtransmission/tracker.c,搜索函数is_rfc2396_alnum( char ch ),找到如下代码:

作者  | 2010-1-2 13:29:49 | 阅读(1671) |评论(0) | 阅读全文>>

解决Fedora11下Java程序中文乱码问题

2009-12-19 12:19:09 阅读512 评论0 192009/12 Dec19

  运行weka程序时发现界面上的中文都显示为小方块,上网搜了以下解决办法,大致都是拷一个中文字体文件到jre/lib/fonts/fallback目录下面,如果没有fallback目录则手动新建一个。我电脑上的jre在/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/下,但是/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib下面连fonts目录也没有,上网搜了半天也没看到跟我类似的问题,后来发现解决办法如此简单:

#cd /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib

#mkdir fonts

#cd fonts

#mkdir fallback

#cd fallback

#cp ......(这里我是把Windows下面的C:\WINDOWS\Fonts下的STSONG.TTF和SURSONG.TTF拷过来了)

#mkfontdir

#mkfontscale

  然后去weka所在目录下运行java -jar weka.jar,中文字体正常显示。

作者  | 2009-12-19 12:19:09 | 阅读(512) |评论(0) | 阅读全文>>

星号(*)的含义

2009-12-18 11:53:51 阅读142 评论0 182009/12 Dec18

  Bash环境下(其它环境下也许类似,但我没有考证),星号(*)作为文件名通配符讲时,匹配任意字符串,而在正则表达式中表示前面的字符出现0次或多次。这是前几天学习的时候没有注意到的,导致很多问题。例如想要显示当前目录下所有文件中的所有行,用grep * *这条命令就不行,而应该改用grep .* *。其中grep的第一个参数是要匹配的字符串,如果用"*"的话,表示前面的空字符串出现任意次,这是没有意义的。正确的做法是改用".*",这里的"."表示任意单个字符,后面加“*”就可以表示任意字符串了。而grep的第二个参数是输入文件,用"*"则可以匹配任意文件名。

作者  | 2009-12-18 11:53:51 | 阅读(142) |评论(0) | 阅读全文>>

学习OpenCV标准Hough变换函数

2009-12-17 22:52:31 阅读1302 评论1 172009/12 Dec17

  Hough变换找直线的程序实在是做得纠结,看原理似乎很简单,但实际做起来还是碰到了不少问题。最主要的就是当theta-rho空间中有几个相邻点的计数值都超过阈值时的取舍问题,整了一下午还是想不出很么好办法。晚上抱着敬畏的心理读了以下OpenCV的源码,感觉受益匪浅。

  首先眼前一亮的是cos值和sin值的计算,icvHoughLinesStandard的处理方式是先把所有要用的都计算出来,存到数组里面。这样以来就避免了大量的重复计算,这对提高Hough变换的效率大有帮助。

  接着看到的就是那个令我纠结的问题,这里先贴一下OpenCV中的代码:

            int base = (n+1) * (numrho+2) + r+1;

            if( accum[base] > threshold &&

                accum[base] > accum[base - 1] && accum[base] >= accum[base + 1] &&

                accum[base] > accum[base

作者  | 2009-12-17 22:52:31 | 阅读(1302) |评论(1) | 阅读全文>>

GNU的sed编辑器

2009-12-14 11:12:54 阅读178 评论0 142009/12 Dec14

译自《Bash Guide for Beginners》第五章

第5章 GNU的sed编辑器

在本章结束之后你将明白: 什么是sed? 交互式的sed用法 正则表达式和流编辑 在脚本中使用sed命令 介绍

这里的讲解很不完备, 自然也不能用作sed用户手册。这一章的意义在于为下一章的有趣话题做准备, 而且每个用户都应该对这个编辑器的基本功能有所了解。

详细信息请参考sed的info和man文档。

5.1 介绍 5.1.1 什么是sed

一个流编辑器, 能够对从文件或管道读出的文本进行基本处理, 并结果送到标准输出。sed 命令的语法并没有对输出文件做出规定, 结果可以通过输出重定向存入文件。这个编辑器不改变原始文件的内容。

sed 与 vi 和 ed 等编辑器的不同之处, 在于它过滤文本及从管道获取输入的能力。当这个编辑器运行时你不需要与它交互;这也是sed被称为批处理编辑器的原因。这一特性允许你在脚本中使用编辑命令, 使得重复性的编辑任务大为简化。当需要在大量文件中替换文本时, sed 非常有用。

5.1.2 sed 命令

sed 程序可以通过正则表达式进行文本模式的替换与删除, 就像使用grep命令一样(参见4.2)。

编辑命令与vi中的类似。

Table 5-1 Sed editing commands 命令结果 a\将文本添加到当前行之下 c\

作者  | 2009-12-14 11:12:54 | 阅读(178) |评论(0) | 阅读全文>>

按位反转数据(转)

2009-12-13 21:35:11 阅读127 评论0 132009/12 Dec13

  今天在CSDN上看到一个整数按位求逆序的算法,感觉很经典,根据回帖人给出的链接,找到了这篇博文:

http://www.cppblog.com/qey/articles/66893.html

算法如下:

x = (x & 0x55555555) << 1 | (x >> 1) & 0x55555555;

x = (x & 0x33333333) <<

作者  | 2009-12-13 21:35:11 | 阅读(127) |评论(0) | 阅读全文>>

正则表达式

2009-12-12 2:10:11 阅读195 评论0 122009/12 Dec12

译自《Bash Guide for Beginners》第四章

暂且写到这里吧,翻译得很烂,将就看看,有空再改~

正则表达式

我们将在这一章讨论:

    正则表达式的使用

    正则表达式的元字符

    在文件或输出中查找模式

    Bash中的字符范围和种类

4.1 正则表达式

4.1.1 什么是正则表达式

    正则表达式是一个描述一组字符串的模式。正则表达式的构造类似于使用不同的运算符将小的表达式连接成算术表达式。

    最基本的组成部分是匹配单个字符的正则表达式。包括所有字母和数字在内的大部分字符,都是与它们自身匹配的正则表达式。具有特殊含义的元字符通常以反斜杠开头。

4.1.2 正则表达式元字符

    一个正则表达式可能由******

表4-1.正则表达式操作符

    操作符  作用

    .       匹配任意单个字符

    ?       前面的元素至多出现一次

    *       前面的元素将会出现零次或者多次

    +       前面的元素至少出现一次

作者  | 2009-12-12 2:10:11 | 阅读(195) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 

湖北省 武汉市

 发消息  写留言

 
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012

   
创建博客 登录  
 关注